当前位置: 首页 > 知识库问答 >
问题:

ExecutorService-关闭主线程

西门智
2023-03-14

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

还有没有更好/更安全的方法来编写下面的代码段,特别是如果我在无限循环中运行这部分,例如等待文件被放到输入目录并分配线程来处理它们?在这种情况下,我应该创建一个新池并。在每个循环迭代中等待终止

非常感谢

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);

共有2个答案

督德泽
2023-03-14

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

被杀戮命令终止

如果这意味着要终止PID/终止JVM进程,那么所有线程都会被应用程序本身关闭。

岳正阳
2023-03-14

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

线程没有被终止(如果你的意思是kill

在这种情况下,我应该创建一个新的池和。每个循环迭代中的终止?

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

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

 类似资料:
  • 在一个实用程序库中,我正在创建一个执行器服务 然后,主线程将向该服务发布一些任务。当主线程完成时,我想关闭Executor服务,以允许应用程序退出。 问题是我只能更改实用程序库中的代码。我考虑的一个选项是使用守护线程。但在发布到该服务的任务完成之前,它会突然关闭。

  • 我对ExecutorService的javadoc#shutdown方法感到困惑。这些说法不矛盾吗? 启动有序关闭,其中执行以前提交的任务,但不接受新任务。此方法不会等待以前提交的任务完成执行。使用waitTersion执行此操作。 如果它能有序地关闭之前提交的任务,那么它怎么能等它们完成执行呢?

  • 我有以下代码

  • 问题内容: 在我的webapp中,我创建了一个使用固定大小的ThreadPool的服务。我在整个应用程序生命周期中都重复使用了相同的代码。 所有人都在Tomcat中运行,这在关闭时给我以下错误: 我确实意识到我需要在关闭tomcat之前先关闭ExecutorService。Soms SO线程已经在谈论这一点,但是我找不到一种干净的方法来解决这个问题。 是否应该在正常关闭线程和执行器的情况下使用建议

  • 我有一个简单的java,它运行一些任务对象(实现)。 除了尽最大努力尝试停止处理正在执行的任务之外,没有任何保证。例如,典型的实现将通过{@link thread#interrupt}取消,因此任何未能响应中断的任务都可能永远不会终止。 我的问题是,有没有办法确保那些(任务)线程会终止?我想出的最佳解决方案是在程序末尾调用,但这显然是愚蠢的。

  • 由于我不关心响应,也不关心这些任务产生的任何异常,所以我选择使用ExecutorService而不是Callable或CompletableFuture。 然后,对于我在controller中接收到的传入请求,运行两个for循环,并将这些任务分配给ExecutorService: 我的问题是关于关闭ExecutorService。我知道优雅关机(shutdown)、混合关机(awaitTermin