問題:
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...