ThreadLocal遇上執行緒池存在的問題

2021-08-09 03:53:46 字數 1346 閱讀 4711

總結:請使用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...