簡體   English   中英

ExecutorService-主線程關閉

[英]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.

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