gpt4 book ai didi

java - ExecutorService - 主线程关闭

转载 作者:行者123 更新时间:2023-12-01 19:46:54 25 4
gpt4 key购买 nike

我从主线程调用下面的代码,使用 ExecutorService 池并启动一个线程来处理找到的每个文件。我试图了解当主线程被终止命令终止时 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);

最佳答案

when the main thread gets terminated by a kill command. What happens to the spawned threads?

主线程不会被终止(如果您指的是命令行中的 kill <pid>),但 JVM 会被终止,在这种情况下,终止会影响所有正在运行的线程。您可以设置关闭处理程序,如果收到终止信号(不是 kill -9 ),这些处理程序将被触发。请参阅:https://stackoverflow.com/a/2541618/179850

In that case should I be creating a new Pool and .awaitTermination in each loop iteration ?

没有。我要做的是将您的作业提交到在循环外部启动的线程池,但保留 Future s 由 executorService.submit(...) 返回在循环内部的集合中。您可以执行类似以下操作来等待每个作业完成。这里有一些异常(exception)情况需要您处理:

// 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();
}

关于java - ExecutorService - 主线程关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52887820/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com