執行緒池 如何保證核心執行緒不被銷毀的

2021-09-11 03:15:48 字數 1666 閱讀 7523

問題:

1.執行緒池是怎麼保證他的核心執行緒不釋放 而一直等待任務的執行的呢?

2.我們一直理解的執行緒run方法執行完畢執行緒就銷毀是不正確的?

3.還有我們為何通過設定allowcorethreadtimeout(true) 就能使核心執行緒銷毀的呢?

答案:1.執行緒阻塞

2.和那個關係不大

3.可以的

有興趣的話,可以看看下面的原始碼分析:

從 exexute 方法開始:

public void execute(runnable command) 

//2.如果當前的任務數大於設定的核心執行緒大小,而且當前的執行緒池狀態時執行狀態,那麼向阻塞佇列中新增任務

if (isrunning(c) && workqueue.offer(command))

//3.如果向佇列中新增失敗,那麼就新開啟乙個執行緒來執行該任務

else if (!addworker(command, false))

reject(command);

}

下面看看 addworker 方法:

private boolean addworker(runnable firsttask, boolean core) 

}boolean workerstarted = false;

boolean workeradded = false;

worker w = null;

try

} finally

if (workeradded)

}} finally

return workerstarted;

}

下面看看 worker 類的run 方法,實際是呼叫的threadpoolexecutor#runworker方法:

final void runworker(threadpoolexecutor.worker w)  catch (runtimeexception x)  catch (error x)  catch (throwable x)  finally 

} finally

}completedabruptly = false;

} finally

}

下面看看 gettask 方法:

private runnable gettask() 

int wc = workercountof(c);

// are workers subject to culling?

//從阻塞任務佇列中取任務,如果設定了allowcorethreadtimeout(true)

// 或者

// 當前執行的任務數大於設定的核心執行緒數,那麼timed =true

boolean timed = allowcorethreadtimeout || wc > corepoolsize;

if ((wc > maximumpoolsize || (timed && timedout))

&& (wc > 1 || workqueue.isempty()))

try catch (interruptedexception retry)

}}

到這裡,所有的謎團都解開了。

執行緒池如何保證核心執行緒不被銷毀

執行緒迴圈獲取佇列中的任務 private runnable gettask int wc workercountof c are workers subject to culling?boolean timed allowcorethreadtimeout wc corepoolsize if w...

如何保證執行緒安全有序性 執行緒池如何保證有序?

在生產環境中,用kafka來解耦是常用的技術手段。為了保證訊息的順序處理,會把相同屬性 同乙個人 同乙個素材等 的訊息發往kafka同乙個partition中。例如,在廣告系統中,會把某乙個ad的轉化資料傳送到同乙個partition。ad1 ad1 msg1,ad1 msg2,順序發到partit...

如何保證執行緒安全有序性 執行緒池如何保證有序?

背景 在生產環境中,用kafka來解耦是常用的技術手段。為了保證訊息的順序處理,會把相同屬性 同乙個人 同乙個素材等 的訊息發往kafka同乙個partition中。例如,在廣告系統中,會把某乙個ad的轉化資料傳送到同乙個partition。ad1 ad1 msg1,ad1 msg2,順序發到par...