日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

threadlocal_了解ThreadLocal背后的概念

發布時間:2023/12/3 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 threadlocal_了解ThreadLocal背后的概念 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

threadlocal

介紹

我知道本地線程,但直到最近才真正使用過它。
因此,我開始深入研究該主題,因為我需要一種傳播某些用戶信息的簡便方法
通過Web應用程序的不同層,而無需更改每個調用方法的簽名。

小前提信息

線程是具有自己的調用棧的單個進程。在Java中,每個調用棧有一個線程,或者每個線程有一個調用棧。即使您沒有在程序中創建任何新線程,線程也可以在沒有您的程序的情況下運行最好的例子是當您僅通過main方法啟動一個簡單的Java程序時,您沒有隱式調用new Thread()。start(),但是JVM為您創建了一個主線程以運行main方法。

主線程是非常特殊的,因為它是所有其他線程都會從中生成的線程,
線程完成后,應用程序結束了它的生命周期。

在Web應用程序服務器中,通常會有一個線程池,因為創建的線程類非常重。所有JEE服務器(Weblogic,Glassfish,JBoss等)都有一個自調整線程池,這意味著線程池會增加或減少需要的時間,因此不會在每個請求上創建線程,而現有的線程將被重用。

了解線程局部

為了更好地理解線程本地,我將展示一種自定義線程本地的非常簡單的實現。

package ccs.progest.javacodesamples.threadlocal.ex1;import java.util.HashMap; import java.util.Map;public class CustomThreadLocal {private static Map threadMap = new HashMap();public static void add(Object object) {threadMap.put(Thread.currentThread(), object);}public static void remove(Object object) {threadMap.remove(Thread.currentThread());}public static Object get() {return threadMap.get(Thread.currentThread());}}

因此,您可以隨時在應用程序中調用CustomThreadLocal上的add方法,該方法將在當前映射中將當前線程作為鍵,并將要與該線程關聯的對象作為值。 該對象可能是您想要從當前執行的線程中的任何位置訪問的對象,或者它可能是您想要與該線程保持關聯并重復使用多次的昂貴對象。
您定義一個ThreadContext類,您在其中擁有要在線程內傳播的所有信息。

package ccs.progest.javacodesamples.threadlocal.ex1;public class ThreadContext {private String userId;private Long transactionId;public String getUserId() {return userId;}public void setUserId(String userId) {this.userId = userId;}public Long getTransactionId() {return transactionId;}public void setTransactionId(Long transactionId) {this.transactionId = transactionId;}public String toString() {return 'userId:' + userId + ',transactionId:' + transactionId;}}

現在是時候使用ThreadContext了。

我將啟動兩個線程,并在每個線程中添加一個新的ThreadContext實例,該實例將保存我想為每個線程傳播的信息。

package ccs.progest.javacodesamples.threadlocal.ex1;public class ThreadLocalMainSampleEx1 {public static void main(String[] args) {new Thread(new Runnable() {public void run() {ThreadContext threadContext = new ThreadContext();threadContext.setTransactionId(1l);threadContext.setUserId('User 1');CustomThreadLocal.add(threadContext);//here we call a method where the thread context is not passed as parameterPrintThreadContextValues.printThreadContextValues();}}).start();new Thread(new Runnable() {public void run() {ThreadContext threadContext = new ThreadContext();threadContext.setTransactionId(2l);threadContext.setUserId('User 2');CustomThreadLocal.add(threadContext);//here we call a method where the thread context is not passed as parameterPrintThreadContextValues.printThreadContextValues();}}).start();} }

注意:
CustomThreadLocal.add(threadContext)是當前線程與ThreadContext實例相關聯的代碼行
正如您將看到執行此代碼一樣,結果將是:

userId:User 1,transactionId:1 userId:User 2,transactionId:2

這是怎么可能的,因為我們沒有將ThreadContext,userId或trasactionId作為參數傳遞給printThreadContextValues?

package ccs.progest.javacodesamples.threadlocal.ex1;public class PrintThreadContextValues {public static void printThreadContextValues(){System.out.println(CustomThreadLocal.get());} }

很簡單

從CustomThreadLocal的內部映射調用CustomThreadLocal.get()時,將檢索與當前線程關聯的對象。

現在,讓我們看看何時使用真正的ThreadLocal類的示例。 (上面的CustomThreadLocal類只是為了了解ThreadLocal類背后的原理,該原理非常快并且以最佳方式使用內存)

package ccs.progest.javacodesamples.threadlocal.ex2;public class ThreadContext {private String userId;private Long transactionId;private static ThreadLocal threadLocal = new ThreadLocal(){@Overrideprotected ThreadContext initialValue() {return new ThreadContext();}};public static ThreadContext get() {return threadLocal.get();}public String getUserId() {return userId;}public void setUserId(String userId) {this.userId = userId;}public Long getTransactionId() {return transactionId;}public void setTransactionId(Long transactionId) {this.transactionId = transactionId;}public String toString() {return 'userId:' + userId + ',transactionId:' + transactionId;} }

如javadoc所述:ThreadLocal實例通常是希望將狀態與線程關聯的類中的私有靜態字段。

package ccs.progest.javacodesamples.threadlocal.ex2;public class ThreadLocalMainSampleEx2 {public static void main(String[] args) {new Thread(new Runnable() {public void run() {ThreadContext threadContext = ThreadContext.get();threadContext.setTransactionId(1l);threadContext.setUserId('User 1');//here we call a method where the thread context is not passed as parameterPrintThreadContextValues.printThreadContextValues();}}).start();new Thread(new Runnable() {public void run() {ThreadContext threadContext = ThreadContext.get();threadContext.setTransactionId(2l);threadContext.setUserId('User 2');//here we call a method where the thread context is not passed as parameterPrintThreadContextValues.printThreadContextValues();}}).start();} }

調用get時 ,新的ThreadContext實例與當前線程關聯,然后將所需值設置為ThreadContext實例。

如您所見,結果與第一組樣本相同。

userId:User 1,transactionId:1 userId:User 2,transactionId:2

(這可能是相反的順序,因此,如果先看到“用戶2”,請不要擔心)

package ccs.progest.javacodesamples.threadlocal.ex2;public class PrintThreadContextValues {public static void printThreadContextValues(){System.out.println(ThreadContext.get());} }

ThreadLocal的另一個非常有用的用法是當您有一個非常昂貴的對象的非線程安全實例時的情況。我發現的大多數極性示例是使用SimpleDateFormat(但很快我將提供另一個使用Webservices端口的示例)

package ccs.progest.javacodesamples.threadlocal.ex4;import java.text.SimpleDateFormat; import java.util.Date;public class ThreadLocalDateFormat {// SimpleDateFormat is not thread-safe, so each thread will have oneprivate static final ThreadLocal formatter = new ThreadLocal() {@Overrideprotected SimpleDateFormat initialValue() {return new SimpleDateFormat('MM/dd/yyyy');}};public String formatIt(Date date) {return formatter.get().format(date);} }

結論:

線程局部變量有很多用途,這里僅描述兩種:(我認為使用最多的)

  • 真正的每線程上下文,例如用戶ID或事務ID。
  • 每線程實例以提高性能。

參考: Java代碼樣本博客中的JCG合作伙伴 Cristian Chiovari 了解了ThreadLocal的概念 。


翻譯自: https://www.javacodegeeks.com/2012/07/understanding-concept-behind.html

threadlocal

總結

以上是生活随笔為你收集整理的threadlocal_了解ThreadLocal背后的概念的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国内自拍视频网站 | 最好看的mv中文字幕国语电影 | 久久国产精品偷 | 中文字幕女同女同女同 | www.三区 | 蜜臀久久99精品久久久久久 | 爱情岛论坛亚洲线路一 | 毛片久久久久久久 | 黄色男同视频 | 无码人妻h动漫 | 在线观看深夜视频 | 麻豆福利影院 | 亚洲第一精品在线观看 | www.rihan| 久久久久亚洲av片无码 | av影院在线 | 男人天堂欧美 | 日日夜夜免费精品视频 | 日本三级黄在线观看 | 精品在线视频免费观看 | 中文在线第一页 | 三级不卡视频 | 人人插人人爽 | 欧美群交射精内射颜射潮喷 | 久久久精品中文字幕 | 久久爱影视i | 山村大伦淫第1部分阅读小说 | 激情五月婷婷久久 | 抽插丰满内射高潮视频 | 岛国av网站 | 美女扒开尿口让男人捅爽 | 一区二区中文字幕在线观看 | 97av在线视频 | 九一网站在线观看 | 一区二区三区不卡在线观看 | 色天天色| 影音先锋一区 | 亚洲精品av中文字幕在线在线 | 91香蕉视频在线观看免费 | 中文日韩字幕 | 91精品国产91久久久久久黑人 | 九草视频在线观看 | 人人艹在线观看 | 久操视频免费看 | 青青草国产精品视频 | 国产视频在线一区二区 | 色综合网站 | 99久久久无码国产精品不卡 | 国产亚洲精品熟女国产成人 | 天天干天天爽天天射 | 免费看一级黄色大全 | 国产一区91精品张津瑜 | 亚洲一区二区三区三州 | 国产精品入口日韩视频大尺度 | 日本高清黄色 | 亚洲日本三级 | 久久99精品久久久久久噜噜 | 貂蝉被到爽流白浆在线观看 | 男女无套免费视频网站动漫 | 四色成人网 | 国产粉嫩在线观看 | 特大巨交吊性xxxx | 四虎色网 | 91中文国产| 91桃色在线观看 | 毛片毛片毛片毛片毛片毛片毛片毛片 | 亚洲a网站 | 色呦呦在线观看视频 | 玖玖在线观看 | 中文在线a∨在线 | 国产成人精品免高潮在线观看 | 久久精品国产露脸对白 | 污污视频免费看 | 九九超碰 | 亚洲欧美日韩国产一区二区三区 | 欧美系列一区二区 | 久久艹免费视频 | 欧美极度另类 | 神马久久久久久久久久 | av福利网站 | 日本一区二区人妻 | 视频在线观看电影完整版高清免费 | 97无码精品人妻 | 一区二区在线视频播放 | 乱短篇艳辣500篇h文最新章节 | 色婷久久| 依人成人网 | 久久福利一区 | 在线一本 | 国产精品刘玥久久一区 | 久草手机在线视频 | 亚洲精品成人区在线观看 | 欧美激情综合 | 免费a网站 | 69视频一区二区三区 | 白石茉莉奈黑人 | 欧美亚洲精品一区二区 | 另类专区欧美 | 国产又色又爽无遮挡免费 |