【问题标题】:ExecutorService - shutdown of main threadExecutorService - 关闭主线程
【发布时间】:2018-10-19 07:39:42
【问题描述】:

我从主线程调用下面的代码,使用 ExecutorService 池并启动一个线程来处理找到的每个文件。 当主线程被 kill 命令终止时,我试图了解 ExecutorService 的行为。产生的线程会发生什么?他们是在完成工作后立即被杀还是终止?

还有没有更好/更安全的方法来编写下面的 sn-p,特别是如果我要在无限循环中运行这部分,例如等待文件被拖放到输入目录并分配线程来处理它们?在这种情况下,我应该在每个循环迭代中创建一个新的 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);

【问题讨论】:

  • 你的意思是一旦你正在杀死JVM进程?
  • 如果你杀死 JVM 进程,所有线程都会在进程中终止。线程始终运行在进程范围内。

标签: java multithreading executorservice


【解决方案1】:

当主线程被 kill 命令终止时。生成的线程会发生什么?

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

在这种情况下,我应该在每次循环迭代中创建一个新的 Pool 和 .awaitTermination 吗?

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

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

【讨论】:

    【解决方案2】:

    如果主线程有些完成,崩溃,睡眠......只要你的逻辑没有与之耦合,就不会影响其他线程。它们是独立的,它们将继续为您完成工作(只要它们不是 JVM 没有优先级的恶魔线程,并且该过程将完成,只剩下恶魔线程)。你维护:

    被kill命令终止

    如果这意味着终止 PID/终止 JVM 进程,那么是的,所有线程都将与应用程序本身一起关闭。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-10
      • 1970-01-01
      相关资源
      最近更新 更多