色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

ThreadLocal父子線程之間該如何傳遞數據?

jf_ro2CN3Fa ? 來源:芋道源碼 ? 2023-02-20 11:26 ? 次閱讀

來源:飛天小牛肉


每個線程都有自己的一個 ThreadLocalMap,ThreadLocal 持有的數據就是存在這個 Map 里的(Thread.ThreadLocalMap threadLocals),所以能夠實現線程隔離,畢竟每個線程的 ThreadLocalMap 都是不一樣的

如果子線程想要拿到父線程的中的 ThreadLocal 值怎么辦呢

比如會有以下的這種代碼的實現。在子線程中調用 get 時,我們拿到的 Thread 對象是當前子線程對象,對吧,每個線程都有自己獨立的 ThreadLocal,那么當前子線程的 ThreadLocalMap 是 null 的(而父線程,也就是 main 線程中的 ThreadLocalMap 是有數據的),所以我們得到的 value 也是 null

publicclassThreadLocalTest{
privatestaticThreadLocalthreadLocal=newThreadLocal();

publicstaticvoidmain(String[]args)throwsException{
threadLocal.set("芋道源碼");
System.out.println("父線程的值:"+threadLocal.get());
newThread(newRunnable(){
@Override
publicvoidrun(){
System.out.println("子線程的值:"+threadLocal.get());
}
}).start();

Thread.sleep(2000);
}
}

結果輸出如下:

父線程的值:芋道源碼
子線程的值:null

要如何解決這個問題呢?

我們先來從 Thread 類中找找思路:

3e9401ae-b0c9-11ed-bfe3-dac502259ad0.png

你會發現,在 ThreadLocalMap threadLocals 的下方,還有一個 ThreadLocalMap 變量 inherittableThreadLocals,inherit 翻譯為繼承

先看下這個變量的注釋:InheritableThreadLocal values pertaining to this thread. This map is maintained by the InheritableThreadLocal class.

oho,這里出現了一個渣渣輝都從未體驗過的傳新類:InheritableThreadLocal

翻譯一下注釋,大概就是,如果你使用 InheritableThreadLocal,那么保存的數據都已經不在原來的 ThreadLocal.ThreadLocalMap threadLocals 里面了,而是在一個新的 ThreadLocal.ThreadLocalMap inheritableThreadLocals 變量中了。

3ee74aee-b0c9-11ed-bfe3-dac502259ad0.png

所以,如果想讓上面那段代碼中,子線程能夠拿到父線程的 ThreadLocal 值,只需要把 ThreadLocal 聲明改為 InheritableThreadLocal 就可以了

下面我們具體來看下 InheritableThreadLocal 是怎么做到父子線程傳值的。

首先看下 new Thread 的時候線程都做了些什么 Thread#init()

privatevoidinit(ThreadGroupg,Runnabletarget,Stringname,longstackSize,AccessControlContextacc){
//省略部分代碼
Threadparent=currentThread();

if(inheritThreadLocals&&parent.inheritableThreadLocals!=null)
//copy父線程的map,創建一個新的map賦值給當前線程的inheritableThreadLocals
this.inheritableThreadLocals=
ThreadLocal.createInheritedMap(parent.inheritableThreadLocals);

//省略部分代碼
}

核心其實就是上面幾句代碼,如果你設置了 inheritableThreadLocals 變量,那么 Thread 就會把父線程 ThreadLocal threadLocals 中的所有數據都 copy 到子線程的 InheritableThreadLocal inheritableThreadLocals

而且,copy 調用的 createInheritedMap 方法其實是一個淺拷貝函數,key 和 value 都是原來的引用地址,這里所謂的 copy 其實就是把一個 Map 中的數據復制到另一個 Map 中:

3f069656-b0c9-11ed-bfe3-dac502259ad0.png

至此,大致的解釋了 InheritableThreadLocal 為什么能解決父子線程傳遞 Threadlcoal 值的問題了,總結下:

  1. 在創建 InheritableThreadLocal 對象的時候賦值給線程的 t.inheritableThreadLocals 變量
  2. 在創建新線程的時候會 check 父線程中 t.inheritableThreadLocals 變量是否為 null,如果不為 null 則 copy 一份數據到子線程的 t.inheritableThreadLocals 成員變量中去
  3. InheritableThreadLocal 重寫了 getMap(Thread) 方法,所以 get 的時候,就會從 t.inheritableThreadLocals 中拿到 ThreadLocalMap 對象,從而實現了可以拿到父線程 ThreadLocal 中的值

審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據
    +關注

    關注

    8

    文章

    7067

    瀏覽量

    89112
  • 變量
    +關注

    關注

    0

    文章

    613

    瀏覽量

    28393
  • 線程
    +關注

    關注

    0

    文章

    505

    瀏覽量

    19700

原文標題:ThreadLocal 父子線程之間該如何傳遞數據?

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    ThreadLocal實例應用

    。通常情況下,為了保證線程安全,我們需要使用鎖或其他同步機制。然而,有些情況下,我們希望在每個線程中都有一份獨立的數據副本,這就是ThreadLocal派上用場的地方。
    的頭像 發表于 09-30 10:19 ?674次閱讀
    <b class='flag-5'>ThreadLocal</b>實例應用

    ThreadLocal的定義、用法及優點

    ThreadLocal 簡介 ThreadLocal是Java中一個非常重要的線程技術。它可以讓每個線程都擁有自己的變量副本,避免了線程間的
    的頭像 發表于 09-30 10:14 ?1084次閱讀
    <b class='flag-5'>ThreadLocal</b>的定義、用法及優點

    LabVIEW多線程編程數據傳遞教程

    很多時候在一個VI的不同線程或者不同VI的不同線程中需要有一些交互——這些線程并不能完全獨立運行,需要一定的數據通信才能正確執行,這時就需要在編程時使用LabVIEW提供的
    的頭像 發表于 11-24 10:05 ?7020次閱讀
    LabVIEW多<b class='flag-5'>線程</b>編程<b class='flag-5'>數據傳遞</b>教程

    鴻蒙原生應用開發-ArkTS語言基礎類庫多線程TaskPool和Worker的對比(二)

    是基于消息傳遞的,Worker通過序列化機制與宿主線程之間相互通信,完成命令及數據交互。 本文參考引用HarmonyOS官方開發文檔,基于API9。
    發表于 03-26 15:25

    線程程之線程間通訊

    線程程之線程間通訊七、線程間通訊  一般而言,應用程序中的一個次要線程總是為主線程執行特
    發表于 10-22 11:43

    Linux系統中進程與線程之間的關系

    線程同步是指線程之間在相互通信時避免破壞各自數據的能力。同步問題是由前面說到的Win32系統的CPU時間片分配方式引起的。雖然在某一時刻,只有一個線程占用CPU(單CPU時)時間,但是
    發表于 09-07 15:48

    請教一下線程之間通信問題

    我想請教一下。兩個線程之間不需要進行同步。只有一些狀態需要從A線程傳輸到B線程。如果說數據只有一個字節的話,還有需要使用線程通信的那些函數去
    發表于 02-01 16:28

    QNX消息傳遞及其在線程間通信的應用

    本文介紹了QNX 嵌入式實時多任務操作系統的消息傳遞和微內核體系結構的特點,創建線程的方法,消息傳遞的基本原理,以及阻塞式消息傳遞線程間通
    發表于 08-11 08:46 ?31次下載

    Delphi教程之多線程數據

    Delphi教程之多線程數據庫,很好的Delphi資料,快來下載學習吧。
    發表于 04-11 15:59 ?5次下載

    Python、線程和全局解釋器鎖

    線程有開始,順序執行和結束三部分。它有一個自己的指令指針,記錄自己運行到什么地方。 線程的運行可能被搶占(中斷),或暫時的被掛起(也叫睡眠),讓其它的線程運行,這叫做讓步。 一個進程中的各個
    的頭像 發表于 11-19 18:02 ?3524次閱讀

    ThreadLocal發生內存泄漏的原因

    前言 ThreadLocal 的作用是提供線程內的局部變量,這種變量在線程的生命周期內起作用,減少同一個線程內多個函數或者組件之間一些公共變
    的頭像 發表于 05-05 16:23 ?3686次閱讀

    ThreadLocal源碼解析及實戰應用

    ThreadLocal 是一個關于創建線程局部變量的類。
    的頭像 發表于 01-29 14:53 ?479次閱讀

    用這4招 優雅的實現Spring Boot異步線程數據傳遞

    Spring Boot 自定義線程池實現異步開發相信看過陳某的文章都了解,但是在實際開發中需要在父子線程之間傳遞一些數據,比如用戶信息,鏈路
    的頭像 發表于 01-30 10:40 ?1147次閱讀

    PyQT5+OpenCV多線程協作演示

    學習多線程最典型的問題就是如何在多個線程之間傳遞消息與寫作,PyQT5的線程支持在不同線程之間傳遞
    的頭像 發表于 03-08 14:58 ?1347次閱讀

    如何使用pthread_barrier_xxx系列函數來實現多線程之間的同步?

    在Linux系統中提供了多種同步機制,本文主要講講如何使用pthread_barrier_xxx系列函數來實現多線程之間進行同步的方法。
    的頭像 發表于 10-23 14:43 ?1066次閱讀
    如何使用pthread_barrier_xxx系列函數來實現多<b class='flag-5'>線程之間</b>的同步?
    主站蜘蛛池模板: 99免费在线观看| 日产国产欧美韩国在线| 0855福利| 无套内射纹身女视频| 免费在线看视频| 国产主播AV福利精品一区| yy8090韩国理伦片在线| 野花社区视频WWW高清| 视频一区亚洲视频无码| 美女搜查官被高难度黑人在线播放| 欧美18videosex性欧美老师| 国产高清超清在线播放| 97色伦在色在线播放| 亚洲 欧美 日韩 卡通 另类| 全黄h全肉细节文在线观看| 久久偷拍国2017| 国内精品自产拍在线少密芽| 国产1769一七六九视频在线| 99久久亚洲精品影院| 一本道综合久久免费| 亚洲AV无码乱码在线观看浪潮| 寂寞护士中文字幕 mp4| 国产 亚洲 中文字幕 在线 | 久久午夜夜伦痒痒想咳嗽P| 国产精品三级在线观看| 成 人 免费 黄 色 网站无毒下载| 手机看片国产免费久久网| 欧美精品成人久久网站| 毛片免费大全| 久久国产香蕉| 久久re6热在线视频精品66| 国产无遮挡又黄又爽在线视频| 中文在线日韩亚洲制服| 亚洲区视频| 亚洲国产成人在线视频| 亚洲 综合 欧美在线 热| 无码人妻丰满熟妇啪啪网不卡| 久久频这里精品99香蕉久网址| ava云直播| 最好看中文字幕国语| 在线观看免费视频a|