總結:請使用transmittablethreadlocal
或使用下文的方法
threadlocal是以執行緒為key的,而執行緒池裡面的執行緒是會被重新利用的,會導致threadlocal出現意料之外的事件。
比如可能會導致在saas中的串庫。
解決辦法如下:
@slf4j
public
class
hithreadpoolexecutor
extends
threadpoolexecutor
public
hithreadpoolexecutor
(int corepoolsize,
int maximumpoolsize,
long keepalivetime, timeunit unit,
blockingqueue
workqueue, threadfactory threadfactory)
public
hithreadpoolexecutor
(int corepoolsize,
int maximumpoolsize,
long keepalivetime, timeunit unit,
blockingqueue
workqueue, rejectedexecutionhandler handler)
public
hithreadpoolexecutor
(int corepoolsize,
int maximumpoolsize,
long keepalivetime, timeunit unit,
blockingqueue
workqueue, threadfactory threadfactory,
rejectedexecutionhandler handler)
@override
public
void
execute
(runnable command)
@override
protected
void
beforeexecute
(thread t, runnable r)
catch
(nosuchfieldexception
| illegalacces***ception e)
}}
需要注意的是execute
方法是在submit
時呼叫的, 而beforeexecute
方法是在執行執行緒任務之前呼叫的。 執行緒ThreadLocal類
threadlocal 在很多地方叫做本地變數,在有些地方叫做執行緒本地儲存。threadlocal 在每個執行緒中為每個變數都建立了乙個副本,每個執行緒可以訪問自己內部的副本變數,而不會對其它執行緒的副本變數造成影響。如果看不懂沒關係,下面會解釋各個函式的意思。public t get publi...
多執行緒 ThreadLocal
目錄 一 threadlocal 概述 1.1 threadlocal 是什麼 1.2 threadlocal 的作用 二 threadlocal 的使用和原始碼分析 2.1 threadlocal 如何使用 2.1.1 常見方法 2.1.2 使用示例 2.2 threadlocal 原始碼分析 2...
多執行緒 ThreadLocal
執行緒的變數副本 就像命名一樣 每個執行緒隔離。每個thread都有自己的threadlocalmap,threadlocalmap的底層是使用陣列 其中每個entry,它的key是threadlocal k,繼承自weakreference,也就是我們常說的弱引用型別,可以簡單地將它的key視作t...