日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

基于TTL 解決線程池中 ThreadLocal 線程無法共享的問題

來源: 責編: 時間:2024-04-08 17:19:23 270觀看
導讀在Java的并發編程領域中,ThreadLocal被廣泛運用來解決線程安全困境,它巧妙地為每個線程提供獨立的變量副本,有效規避了線程間數據共享的問題。不過,在使用線程池時,傳遞線程局部變量在父子線程之間并非易事。這是因為Threa

在Java的并發編程領域中,ThreadLocal被廣泛運用來解決線程安全困境,它巧妙地為每個線程提供獨立的變量副本,有效規避了線程間數據共享的問題。WSM28資訊網——每日最新資訊28at.com

不過,在使用線程池時,傳遞線程局部變量在父子線程之間并非易事。這是因為ThreadLocal的設計初衷僅在于線程內的數據隔離,無法支持跨線程間的數據傳遞。WSM28資訊網——每日最新資訊28at.com

背景

在基于Java的應用開發領域,尤其是在利用Spring框架、異步處理和微服務架構構建系統時,常常需要在不同線程或服務之間傳遞用戶會話、數據庫事務或其他上下文信息。WSM28資訊網——每日最新資訊28at.com

舉例來說,在處理用戶請求的Web服務中,記錄日志是必不可少的一環。這些日志需包含請求的獨特標識(如請求ID),這個ID在請求進入服務時生成,并會貫穿整個處理流程,包括可能并發執行的多個子任務或被分配到線程池中不同線程上執行。(在分布式場景中通常會稱之為traceId)WSM28資訊網——每日最新資訊28at.com

在這種情況下,使用ThreadLocal來存儲請求ID會帶來問題:并發執行的子任務無法訪問父線程ThreadLocal中存儲的請求ID,而且在使用線程池時,線程的重用可能導致請求ID被錯誤地共享或丟失。WSM28資訊網——每日最新資訊28at.com

偽代碼:WSM28資訊網——每日最新資訊28at.com

import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class ThreadLocalExample {        private static ThreadLocal<String> requestId = new ThreadLocal<>();    public static void main(String[] args) {        requestId.set("12345"); // 設置請求ID        ExecutorService executor = Executors.newFixedThreadPool(2);        executor.submit(() -> {            System.out.println("Child task running in a separate thread: " + requestId.get());        });        executor.shutdown();    }}

在這個示例中,父線程設置了請求ID為"12345",但是當子任務在另一個線程中執行時,無法訪問到父線程中的ThreadLocal變量requestId,因此子任務無法獲取到請求ID,可能會輸出null或者""。WSM28資訊網——每日最新資訊28at.com

偽代碼:WSM28資訊網——每日最新資訊28at.com

import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class ThreadLocalThreadPoolExample {        private static ThreadLocal<String> requestId = new ThreadLocal<>();    public static void main(String[] args) {        requestId.set("12345"); // 設置請求ID        ExecutorService executor = Executors.newFixedThreadPool(2);        executor.submit(() -> {            System.out.println("Child task running in a thread pool: " + requestId.get());        });        // 另一個任務復用線程        executor.submit(() -> {            System.out.println("Another child task running in the same thread: " + requestId.get());        });        executor.shutdown();    }}

在這個示例中,如果線程池中的兩個任務在同一個線程中執行,且沒有正確處理ThreadLocal變量,可能會導致第二個任務獲取到了第一個任務的請求ID,導致請求ID的錯誤共享。WSM28資訊網——每日最新資訊28at.com

技術選型

為了應對這一難題,可以采用TransmittableThreadLocal(TTL)這一阿里巴巴開源工具庫,專為解決在使用線程池等會重用線程的情況下,ThreadLocal無法正確管理線程上下文的問題而設計。WSM28資訊網——每日最新資訊28at.com

GitHub開源地址:https://github.com/alibaba/transmittable-thread-localWSM28資訊網——每日最新資訊28at.com

TransmittableThreadLocal基于ThreadLocal進行擴展,提供了跨線程傳遞數據的能力,確保父線程傳遞值給子線程,并支持線程池等場景下的線程數據隔離。WSM28資訊網——每日最新資訊28at.com

此外,還有JDK自帶的InheritableThreadLocal,用于主子線程間參數傳遞。然而,這種方式存在一個限制:必須在主線程手動創建子線程才可使用,而在線程池中則難以實現此種傳遞機制。WSM28資訊網——每日最新資訊28at.com

具體實現

依賴引入

首先,需在項目中引入TransmittableThreadLocal的依賴。若為Maven項目,可添加以下依賴:WSM28資訊網——每日最新資訊28at.com

<dependency>  <groupId>com.alibaba</groupId>  <artifactId>transmittable-thread-local</artifactId>  <version><!-- 使用最新版本 --></version> </dependency>

使用TransmittableThreadLocal存儲請求ID

public class RequestContext {    // 使用TransmittableThreadLocal來存儲請求ID    private static final ThreadLocal<String> requestIdTL = new TransmittableThreadLocal<>();    public static void setRequestId(String requestId) {        requestIdTL.set(requestId);    }    public static String getRequestId() {        return requestIdTL.get();    }    public static void clear() {        requestIdTL.remove();    }}
創建一個線程池,并使用TTL提供的工具類確保線程池兼容TransmittableThreadLocal
import com.alibaba.ttl.threadpool.TtlExecutors;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class ThreadPoolUtil {    private static final ExecutorService pool = Executors.newFixedThreadPool(10);    // 使用TtlExecutors工具類包裝原始的線程池,使其兼容TransmittableThreadLocal    public static final ExecutorService ttlExecutorService = TtlExecutors.getTtlExecutorService(pool);    public static ExecutorService getExecutorService() {        return ttlExecutorService;    }}

TtlExecutors是TransmittableThreadLocal(TTL)庫中的一款實用工具類,其機制在于對Java標準庫中的ExecutorService、ScheduledExecutorService等線程池接口的實例進行包裝。WSM28資訊網——每日最新資訊28at.com

通過這種封裝,確保在使用線程池時,能夠正確地傳遞TransmittableThreadLocal中存儲的上下文數據,即使任務在不同線程中執行。這對于解決在使用線程池時ThreadLocal變量值傳遞的問題至關重要。WSM28資訊網——每日最新資訊28at.com

執行并行任務,并在任務中使用RequestContext來訪問請求ID
import java.util.stream.IntStream;public class Application {    public static void main(String[] args) {        // 模擬Web應用中為每個請求設置唯一的請求ID        String requestId = "REQ-" + System.nanoTime();        RequestContext.setRequestId(requestId);        try {            ExecutorService executorService = ThreadPoolUtil.getExecutorService();            IntStream.range(0, 5).forEach(i ->                 executorService.submit(() -> {                    // 在子線程中獲取并打印請求ID                    System.out.println("Task " + i + " running in thread " + Thread.currentThread().getName() + " with Request ID: " + RequestContext.getRequestId());                })            );        } finally {            // 清理資源            RequestContext.clear();            ThreadPoolUtil.getExecutorService().shutdown();        }    }}


WSM28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-82037-0.html基于TTL 解決線程池中 ThreadLocal 線程無法共享的問題

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 超越GPT4的Agent,我用代碼實現了!

下一篇: Go 哪里沒有做好?Rob Pike 深刻反思了

標簽:
  • 熱門焦點
  • 線程通訊的三種方法!通俗易懂

    線程通信是指多個線程之間通過某種機制進行協調和交互,例如,線程等待和通知機制就是線程通訊的主要手段之一。 在 Java 中,線程等待和通知的實現手段有以下幾種方式:Object 類下
  • K8S | Service服務發現

    一、背景在微服務架構中,這里以開發環境「Dev」為基礎來描述,在K8S集群中通常會開放:路由網關、注冊中心、配置中心等相關服務,可以被集群外部訪問;圖片對于測試「Tes」環境或者
  • 在線圖片編輯器,支持PSD解析、AI摳圖等

    自從我上次分享一個人開發仿造稿定設計的圖片編輯器到現在,不知不覺已過去一年時間了,期間我經歷了裁員失業、面試找工作碰壁,寒冬下一直沒有很好地履行計劃.....這些就放在日
  • 最“俊美”淘寶賣家,靠直播和短視頻圈粉,上架秒光,年銷3000萬

    來源 | 電商在線文|易琬玉編輯|斯問受訪店鋪:Ringdoll戒之人形圖源:微博@御座的黃山、&ldquo;Ringdoll戒之人形&rdquo;淘寶店鋪有關外貌的評價,黃山已經聽累了。生于1985年的他,哪
  • “又被陳思誠騙了”

    作者|張思齊 出品|眾面(ID:ZhongMian_ZM)如今的國產懸疑電影,成了陳思誠的天下。最近大爆電影《消失的她》票房突破30億斷層奪魁暑期檔,陳思誠再度風頭無兩。你可以說陳思誠的
  • 新電商三兄弟,“抖快紅”成團!

    來源:價值研究所作 者:Hernanderz 隨著內容電商的概念興起,抖音、快手、小紅書組成的&ldquo;新電商三兄弟&rdquo;成為業內一股不可忽視的勢力,給阿里、京東、拼多多帶去了巨大壓
  • 花7萬退貨退款無門:誰在縱容淘寶珠寶商家造假?

    來源:極點商業作者:楊銘在淘寶購買珠寶玉石后,因為保證金不夠賠付,店鋪關閉,退貨退款難、維權無門的比比皆是。&ldquo;提供相關產品鑒定證書,支持全國復檢,可以30天無理由退換貨。&
  • OPPO K11搭載高性能石墨散熱系統:旗艦同款 性能涼爽釋放

    日前OPPO官方宣布,將于7月25日14:30舉辦新品發布會,屆時全新的OPPO K11將正式與大家見面,將主打旗艦影像,和同檔位競品相比,其最大的賣點就是將配備索尼
  • 蘋果MacBook Pro 2021測試:仍不支持平滑滾動

    據10月30日9to5 Mac 消息報道,蘋果新的 14 英寸和 16 英寸 MacBook Pro 2021 上市后獲得了不錯的評價,亮點包括行業領先的性能,令人印象深刻的電池續航,精美豐
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
国产精品久久9| 亚洲欧洲精品一区二区精品久久久| 欧美大成色www永久网站婷| 久久久久国产免费免费| 久久久欧美精品sm网站| 久久久久久穴| 模特精品在线| 欧美成人中文字幕在线| 免费国产一区二区| 久久综合九色综合网站| 美女福利精品视频| 蜜臀va亚洲va欧美va天堂| 欧美精品一区二区三区在线看午夜 | 欧美先锋影音| 亚洲第一二三四五区| 91久久精品日日躁夜夜躁欧美| 日韩午夜电影在线观看| 亚洲欧美日韩国产一区| 欧美自拍丝袜亚洲| 性8sex亚洲区入口| 欧美一区二区高清| 久久成人羞羞网站| 久久久久久999| 欧美成人69| 国产精品国产三级国产普通话三级| 国产有码在线一区二区视频| 久久久久久有精品国产| 欧美成人在线免费视频| 欧美精品免费视频| 欧美涩涩网站| 狠狠色狠狠色综合人人| 日韩一区二区免费看| 久久aⅴ乱码一区二区三区| 欧美电影电视剧在线观看| 国产精品日韩| 亚洲国产另类久久久精品极度| 亚洲愉拍自拍另类高清精品| 女人色偷偷aa久久天堂| 国产精品成av人在线视午夜片| 樱桃国产成人精品视频| 9l视频自拍蝌蚪9l视频成人| 久久手机精品视频| 欧美日韩国产va另类| 国产一区二区三区观看| 一区二区三区日韩精品视频| 欧美成人精品在线播放| 国产欧美日韩综合| 在线精品亚洲一区二区| 亚洲欧美在线高清| 久久久久久久综合| 欧美激情影音先锋| 国产精品久久久久久福利一牛影视| 亚洲欧洲在线一区| 亚洲一级黄色片| 欧美福利视频| 韩国免费一区| 亚洲欧美久久久| 欧美日韩xxxxx| 国内精品久久久久影院优| 中文国产成人精品久久一| 久久亚洲综合网| 国产精品视频导航| 亚洲国产成人久久综合一区| 久久久久欧美精品| 欧美日韩综合另类| 一区在线播放| 久久精精品视频| 国产精品欧美激情| 亚洲国产精品精华液网站| 久久国产欧美日韩精品| 国产精品www.| 99精品欧美一区二区三区| 免费人成精品欧美精品| 国语自产精品视频在线看| 亚洲欧美日韩精品综合在线观看| 欧美午夜激情小视频| 亚洲欧洲免费视频| 欧美主播一区二区三区美女 久久精品人 | 国语对白精品一区二区| 亚洲欧美视频在线| 欧美大片第1页| 一区免费视频| 久久精品亚洲精品国产欧美kt∨| 国产亚洲毛片| 午夜国产精品影院在线观看| 国产精品日韩精品欧美在线| 亚洲欧美日韩电影| 欧美精品一区二区三区很污很色的 | 亚洲激情在线| 欧美成人免费视频| 国产亚洲欧洲| 久久精彩免费视频| 国产精品美女xx| 亚洲一二三四久久| 欧美精品福利在线| 在线观看日韩av电影| 久久免费精品视频| 国产毛片精品视频| 一区二区三区久久网| 欧美日韩蜜桃| 一本久道久久综合狠狠爱| 欧美剧在线观看| 日韩亚洲精品电影| 欧美第十八页| 亚洲精品麻豆| 欧美日韩国产精品一区| av不卡在线观看| 欧美日韩一区二区三区在线观看免 | 亚洲国产精品成人一区二区| 欧美激情五月| 亚洲最新中文字幕| 欧美美女bb生活片| 亚洲黄色天堂| 欧美欧美天天天天操| 99精品国产高清一区二区| 欧美日韩一区二区欧美激情 | 在线观看亚洲一区| 久久米奇亚洲| 亚洲高清不卡在线| 久久亚洲一区二区三区四区| 日韩视频第一页| 欧美视频中文一区二区三区在线观看| 亚洲欧美国产va在线影院| 国产日韩欧美在线观看| 久久久久久久999| 亚洲国产高清在线| 免费av成人在线| 99国产精品久久久久久久久久| 国产精品一二一区| 欧美一级夜夜爽| …久久精品99久久香蕉国产 | 亚洲电影视频在线| 久久一区二区三区四区五区| 一本一本久久| 国产亚洲欧美日韩精品| 模特精品在线| 在线一区二区三区四区五区| 好看的av在线不卡观看| 欧美国产亚洲另类动漫| 亚洲一区二区三区欧美| 国产午夜亚洲精品不卡| 欧美大片在线看免费观看| 亚洲一区二区在线免费观看视频| 一区二区在线视频播放| 欧美日韩在线一区| 亚洲资源在线观看| 国产视频在线观看一区二区三区| 欧美国产日产韩国视频| 亚洲网站啪啪| 一区精品久久| 欧美性理论片在线观看片免费| 久久久久国产一区二区| 日韩视频精品在线| 国产精品每日更新| 久久九九免费| 一本久道久久综合婷婷鲸鱼| 经典三级久久| 国产精品久久久999| 久久综合五月天婷婷伊人| 亚洲视频香蕉人妖| 国产亚洲成年网址在线观看| 欧美视频在线一区| 欧美亚洲视频一区二区| 亚洲精品久久久久久久久久久久久| 国产日韩欧美三级| 老司机久久99久久精品播放免费 | 欧美日韩成人综合在线一区二区| 久久久久久久精| 亚洲午夜精品| 亚洲精品123区| 国产日产精品一区二区三区四区的观看方式| 欧美韩日一区二区三区| 久久大逼视频| 亚洲视频一二区| 亚洲电影欧美电影有声小说| 国产日本欧洲亚洲| 欧美成熟视频| 久久久999精品视频| 亚洲深爱激情| 亚洲娇小video精品| 国产一区二区高清视频| 欧美三级特黄| 欧美激情aaaa| 久久天堂av综合合色| 性欧美办公室18xxxxhd| 一区二区三区免费看| 亚洲国产美国国产综合一区二区| 国内不卡一区二区三区| 国产精品普通话对白| 欧美日韩美女在线| 久久婷婷久久一区二区三区| 久久国产精品色婷婷| 亚洲欧美日韩国产一区二区三区| 一区二区三区 在线观看视| 亚洲激情在线观看视频免费| 亚洲高清免费| 1000精品久久久久久久久 | 亚洲美女中出| 在线观看日韩av先锋影音电影院| 狠狠久久五月精品中文字幕| 国内成人精品2018免费看 | 国产精品成人一区二区艾草| 欧美天天综合网| 欧美日韩国产精品自在自线|