簡體   English   中英

線程池不接受新任務

[英]Thread pool not accepting new tasks

我感覺我的Java並發性知識變得越來越生銹,我試圖找出為什么線程池在以下代碼中不接受更多任務:

ExecutorService e = Executors.newFixedThreadPool(aNumber);

// Task 1
for (int i=0; i<n; i++)
    e.submit(new aRunnable());
while (!e.isTerminated());
System.out.println("Task 1 done");

// Task 2
for (int i=0; i<n; i++)
    e.submit(new anotherRunnable());
while (!e.isTerminated());
System.out.println("Task 2 done");

它永遠無法啟動任務2,當任務1中的最后一個任務運行時,線程正在“凍結”,就像它在等待其他任務完成一樣。

怎么了?

它永遠無法啟動任務2,當任務1中的最后一個任務運行時,線程正在“凍結”,就像它在等待其他任務完成一樣。

正在等待。 ExecutorService.isTerminated()在線程池關閉等待線程池任務完成。 由於您從未調用過e.shutdown(); 您的循環將永遠旋轉。 引用ExecutorService javadocs

如果所有任務在關閉后都已完成,則返回true。 請注意,除非先調用shutdown或shutdownNow,否則isTerminated永遠不會為真。

您尚未關閉服務,因此永遠不會如此。 通常,在while循環中旋轉的任何東西都是極其糟糕的模式。 通常,我們使用e.awaitTermination(...)但是同樣,只有在您調用e.shutdown();之后,我們e.awaitTermination(...)使用e.awaitTermination(...) 而且您不想關閉ExecutorService ,因為您將向它提交更多任務。

如果要等待所有任務完成,然后提交更多任務,我將執行以下操作,並在第一批提交任務返回的Future上調用get() 就像是:

List<Future> futures = new ArrayList<Future>();
for (int i=0; i<n; i++) {
    futures.add(e.submit(new aRunnable()));
}
// now go back and wait for all of those tasks to finish
for (Future future : futures) {
    future.get();
}
// now you can go forward and submit other tasks to the thread-pool

如果您想知道特定任務的完成時間,請使用ExecutorService,該函數將返回Future <>(可用於獲取特定作業狀態的句柄)-執行器本身直到關閉后才會終止它下來。 想像執行程序,例如“批處理隊列”或“協處理器”,等待着您在料斗中投入一些工作。

更新:格雷的回答比我好得多-請參閱他的帖子。 -(人們如何快速打字?)

暫無
暫無

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

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