簡體   English   中英

ThreadPool不會按順序運行任務

[英]ThreadPool does not run tasks in sequence

我正在使用Executor框架專門Executors.newCachedThreadPool();
我有一個Runnable的列表,例如100。
前50個,每個創建一個值(存儲在列表中)以供最后50個使用。
我想如果我按照它們在列表中的順序在executor.execute()中傳遞Runnable ,它們也將以相同的順序執行。
但這不會發生。
這些任務似乎是以隨機順序執行的,它們是交錯的,不是按順序執行的。
這是假設工作的方式嗎? 有辦法解決這個問題嗎?

謝謝

您需要分兩批提交作業,或者以其他方式創建明確的“先發生”關系。 建議構建兩批作業並使用invokeAll(batch1); invokeAll(batch2); invokeAll(batch1); invokeAll(batch2); invokeAll()方法將執行所有任務並阻塞,直到它們完成。 您可能需要將Runnable包裝為Callable ,您可以使用Executors.callable(Runnable r) (@Cameron Skinner打敗我以獲得一些代碼示例,看到更多的答案...)

執行者的全部意義是抽象出執行的具體細節,因此除非明確說明,否則不能保證訂購。 如果您想要嚴格順序執行,請在您運行的線程(最簡單)中執行,在單線程執行程序,ala Executors.newSingleThreadExecutor() ,或顯式同步任務。 如果要執行后者,可以使用屏障或鎖存器,並在屏障/鎖存器上阻止相關任務。 您還可以讓第一個任務塊實現Callable ,返回Future ,並讓依賴任務調用myFuture.get() ,這將導致它們阻塞,直到返回結果。

如果您更多地了解您的具體應用,我們可能會更具體地提供幫助。

這是正確的行為。 您無法保證Runnables的執行順序。

執行程序並行運行,而您似乎希望任務以串行方式運行。 您可以提交前50個作業,等待它們完成,然后提交第二個50個作業,或者(如果執行順序很重要)只需在一個線程中運行它們。

例如,

for (Future<Whatever> f: service.invokeAll(first50tasks)) {
    addResultToList(f.get());
}
Future<Whatever> output = service.invokeAll(second50tasks);

也許你可以execute前50, shutdownawaitTermination ,然后再execute其他50? 有關示例代碼,請參閱此答案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM