[英]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, shutdown
和awaitTermination
,然后再execute
其他50? 有關示例代碼,請參閱此答案 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.