[英]ExecutorService - shutdown of main thread
我有下面的代碼從主線程調用,使用ExecutorService池並啟動一個線程來處理找到的每個文件。 當主線程被kill命令終止時,我試圖了解ExecutorService的行為。 產生的線程會怎樣? 他們是立即被殺害還是在完成工作后辭職?
還有沒有更好/更安全的方法來編寫以下代碼段,特別是如果我要在無限循環中運行此部分時,例如,等待將文件拖放到輸入目錄並分配線程來處理它們? 在那種情況下,我應該在每次循環迭代中創建一個新的Pool和.awaitTermination
嗎?
非常感謝
ExecutorService executorService = Executors.newFixedThreadPool(maxThreads);
for (File inputFile : inputDir.listFiles()) {
if (inputFile.isFile())
executorService.submit(new MyRunnable(inputFile));
}
executorService.shutdown();
executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
當主線程被kill命令終止時。 產生的線程會怎樣?
主線程不會被殺死(如果您是從命令行中kill <pid>
),但是JVM被殺死,在這種情況下,殺死會影響所有正在運行的線程。 您可以設置關機處理程序,如果接收到kill -9
信號(不是kill -9
),則將觸發該程序。 參見: https : //stackoverflow.com/a/2541618/179850
在那種情況下,我應該在每次循環迭代中創建一個新的Pool和.awaitTermination嗎?
不。我要做的是將您的作業提交到循環外啟動的線程池,但將executorService.submit(...)
返回的Future
保留在循環內的集合中。 您可以執行以下操作來等待每個作業完成。 您可以在這里處理一些例外情況:
// this is all inside of the loop with the executorService created outside of loop
List<Future<?>> futures = new ArrayList<>();
for (File inputFile : inputDir.listFiles()) {
if (inputFile.isFile())
futures.add(executorService.submit(new MyRunnable(inputFile)));
}
}
// now we go back and wait for the jobs to finish
for (Future<?> future : futures) {
// this waits for each job to finish
// it throws some exceptions that you'll need to catch and handle
future.get();
}
如果主線程完成了一些工作,崩潰了,進入了睡眠狀態……只要您的邏輯未與之耦合,這不會影響其他線程。 它們是獨立的,它們會繼續為您完成工作(只要它們不是JVM不優先的惡魔線程,並且僅剩下惡魔線程就可以完成該過程)。 您維護了:
被kill命令終止
如果這意味着要殺死PID /殺死JVM進程,那么是的,所有線程將與應用程序本身一起關閉。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.