在使用執行緒池時應特別注意對ThreadLocal的使用
ThreadLocal可以為當前執行緒儲存區域性變數,而InheritableThreadLocal則可以在建立子執行緒的時候將父執行緒的區域性變數傳遞到子執行緒中。
如果使用了執行緒池(如Executor),那麼即使即使父執行緒已經結束,子執行緒依然存在並被池化。這樣,執行緒池中的執行緒在下一次請求被執行的時候,ThreadLocal物件的get()方法返回的將不是當前執行緒中設定的變數,因為池中的“子執行緒”根本不是當前執行緒建立的,當前執行緒設定的ThreadLocal變數也就無法傳遞給執行緒池中的執行緒。
因此,必須將外部執行緒中的ThreadLocal變數顯式地傳遞給執行緒池中的執行緒。
相關推薦
在使用執行緒池時應特別注意對ThreadLocal的使用
ThreadLocal可以為當前執行緒儲存區域性變數,而InheritableThreadLocal則可以在建立子執行緒的時候將父執行緒的區域性變數傳遞到子執行緒中。 如果使用了執行緒池(如Executor),那麼即使即使父執行緒已經結束,子執行緒依然存在並被池化。這樣,執
在使用線程池時應特別註意對ThreadLocal的使用
log 並且 重新 mac hive ava arch huang 線程池 使用ThreadLocal並且有線程池時要特別註意,ThreadLocal是以線程為key的,而線程池裏面的線程是會被重新利用的,所以如果有使用線程池並且使用ThreadLocal來保存狀態信息時要
【小家java】Java中的執行緒池,你真的用對了嗎?(教你用正確的姿勢使用執行緒池)
相關閱讀 【小家java】java5新特性(簡述十大新特性) 重要一躍 【小家java】java6新特性(簡述十大新特性) 雞肋升級 【小家java】java7新特性(簡述八大新特性) 不溫不火 【小家java】java8新特性(簡述十大新特性) 飽受讚譽 【小家java】java9
當面試官問執行緒池時,你應該知道些什麼?
Java面試中,執行緒池也算是一個高頻的問題,其實就JDK原始碼來看執行緒池這一塊的實現程式碼應該算是寫的清晰易懂的,通過這篇文章,我們就來盤點一下執行緒池的知識點。 本文基於JDK1.8原始碼進行分析 首先看下執行緒池建構函式: public ThreadP
使用執行緒池時讓所有執行緒都執行完再進行下一步
我們知道,當不使用執行緒池時,想讓A執行緒在B執行緒執行完之後執行,需要在A中的某個呼叫處,呼叫B.join,但如果使用jdk1.5以後提供的執行緒池ExecutorService,這個就用不上了,用了會出同步問題,其實這個場景應該是很常見的吧,比如你用多執行緒併發執
ThreadLocal遇到執行緒池時, 各執行緒間的資料會互相干擾, 串來串去
最近遇到一個比較隱蔽而又簡單地問題,在使用ThreadLocal時發現出現多個執行緒中值串來串去,排查一番,確定問題為執行緒池的問題,執行緒池中的執行緒是會重複利用的,而ThreadLocal是用執行緒來做Key的所以在使用執行緒池的時候要特別注意ThreadL
Druid 執行緒池配置時遇到的問題 “(*) property for user to setup”
Druid 阿里巴巴提供的一個執行緒池,標榜的是最好的執行緒池。可以有SQL監控的web功能。按照官網的參考配置 https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98。 spring
Junit單元測試+aop+spring+執行緒池,在進行Junit測試時切面中執行緒池內呼叫的方法不執行
一、問題背景: 寫了一個切面,指向某service包下的所有類及方法,當該service包下方法被呼叫時切面執行,切面中用了執行緒池ExecutorService pool = Executors.newFixedThreadPool(5);執行緒池內呼叫了dao層的方法。 二、問題描述:單
延時執行的執行緒池ScheduledExecutorService
一、ScheduledExecutorService的延時執行功能 ScheduledExecutorService是延時執行的執行緒池,推薦用ScheduledExecutorService代替timer定時器。 建立一個ScheduledExecutorService
一個線上小問題解決過程 —— java執行緒池使用注意點
表象和場景 最近小夥伴在凌晨0點40分左右會收到某臺伺服器報警,cpu使用率過高(達到95%),但是不到10分鐘使用率降到45%,在之後5分鐘內降到10%以內,服務恢復。 背景:公司是用微服務架構,某個產品大約有30多個微服務,前端用阿里雲的SLB,架了nginx叢集;
自己對執行緒池的理解
工作中難免會遇到需要使用執行緒的地方,在使用執行緒的過程中,執行緒池我覺得是非常有必要去簡單瞭解一下的;這裡我會將自己所體會的感悟的一些基本內容分享出來,希望能對少數人有所幫助;如果有不對的地方,還請各位幫忙指出。 為什麼使用執行緒池? 在J
對純for迴圈進行並行流和執行緒池優化簡記
最近在專案中需要根據角色拿對應任務(activiti 中的內容),再根據任務拿工單集(任務跟工單為多對一的關係,所以還需過濾掉重複的工單),獲得最終結果集的耗時較大,所以考慮從多執行緒方向優化。 這些操作在一個for迴圈裡涉及兩處資料庫查詢IO,但IO的阻塞不嚴重,不屬於I
淺談對執行緒池的理解
1、首先由幾個介面和類的關係是需要先說明的: extends implementsextends Executor(介面)----------------->ExecutorService(介面)------------------->AbstractExe
Java執行緒池ExecutorService時讓主執行緒等待子執行緒完成後繼續處理
(() -> { try { System.out.println(finalI + " 我執行了。。。"); Thread.sleep(5000L);
Java執行緒池的使用方式,核心執行原理、以及注意事項
Java執行緒池的使用方式,核心執行原理、以及注意事項 執行緒池的緣由 執行緒池的處理流程 執行緒池的使用(ThreadPoolExecutor) 執行緒池的注意事項 執行緒池的緣由 java中為了提高併發度,可以使用多執行緒共同
執行緒池使用FutureTask時候需要注意的一點事, 獲取執行緒執行結果
8.4 執行緒池使用FutureTask時候需要注意的一點事 執行緒池使用FutureTask的時候如果拒絕策略設定為了 DiscardPolicy和DiscardOldestPolicy並且在被拒絕的任務的Future物件上呼叫無參get方法那麼呼叫執行緒會一
Tomcat設定成NIO時,使用的執行緒池
設定成NIO時, <Connector port="8088" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads屬性是沒用的,因為預設使用的是NIO的執行緒池,除非你使用了executo
多執行緒--做單元測試時,使用執行緒池發現並沒有執行指定程式碼,直接跳過
案例 今天做單元測試除錯介面,發現介面呼叫成功但是並沒有執行執行緒池執行的方法,而是直接跳過執行程式碼 ExecutorService pool = Executors.newFixedThre
muduo庫中對執行緒池的實現(2)
這兩天花時間嘗試實現了一下執行緒池,本來是想完全自己寫的,但是寫著寫著就去參考muduo庫的執行緒池了,實現思路和muduo庫的執行緒池一模一樣。我嘗試著在不考慮執行緒安全的情況下對muduo庫執行緒池的實現做一下簡述。 1. 核心思想 執行緒池的關鍵點在於兩點:空閒執行
Java併發程式設計——執行緒池的使用(五)延時執行的執行緒池ScheduledExecutorService
一、ScheduledExecutorService的延時執行功能 ScheduledExecutorService是延時執行的執行緒池,推薦用ScheduledExecutorService代替timer定時器。 建立一個ScheduledExecutor