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

如何关闭ExecutorService可运行程序的多个实例?

卓云
2023-03-14

我试图理解如何处理ExecutorService执行Runnable命令的许多实例。关于提供的代码,如果我在固定线程池设置为1的情况下执行100个Runnable,需要多少次关闭?我认为代码应该以for循环的执行顺序,用一个线程(绝不会产生超过一个线程)顺序执行一百个futures,并且需要关闭一个ExecutorService。对吗?此外,在for循环完成后立即调用shutdown也是可以的,因为所有一百个未来都在队列中,所以在所有一百个未来完成后,executorService将自动关闭。只是想澄清一下,谢谢。

public static void main(String[] args)
{
    private static ExecutorService executorService = Executors.newFixedThreadPool(1);

    for (int i = 0; i < 100; i++)
    {
        executorService.execute(new Runnable() {
            @Override
            public void run()
            {
                // do stuff
            }
        });
    }

    executorService.shutdown();
}   

共有1个答案

纪佐
2023-03-14

看来你的想法是对的。不管您将多少可运行程序交给ExecutorService运行,也不管您分配了多大的线程池,您只需要调用shutdown()一次。这将允许完成所有任务,但不允许添加任何新任务。你可能想打个电话

try {
    executorService.awaitTermination(5, TimeUnit.MINUTES);
} catch (InterruptedException e) {
    // do stuff
}

根据您的使用场景,在所有任务完成时阻止。

如果您想关闭并尝试杀死所有正在运行的任务,请改为调用Shutdown Now()方法。请注意,不能保证它能够中断正在运行的任务。

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

  • 我从主线程调用了下面的代码,使用ExecutorService池并启动一个线程来处理找到的每个文件。我正在尝试了解当主线程被kill命令终止时ExecutorService的行为。生成的线程会发生什么?一旦完成工作,它们会立即被杀还是终止? 还有没有更好/更安全的方法来编写下面的代码段,特别是如果我在无限循环中运行这部分,例如等待文件被放到输入目录并分配线程来处理它们?在这种情况下,我应该创建一个

  • 我正在编写一个带有ExecutorService的单例类的SDK。它看起来像这样: 此SDK类用于在整个应用程序中运行任务/可运行程序,doSomething()函数用于在单个线程中排队并运行所有可运行程序。 但有一件事我搞不清楚,那就是什么时候给ExecutorService打电话。shutdown()方法。如果我这样称呼它: 它会破坏使用一个Thread的目的,因为如果在第二次调用doThin

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

  • 问题内容: 我有这个可运行的窗口: 我是否可以在此处设置一个计时器在1或2分钟内将其关闭,而不是单击“确定”按钮? 问题答案: 是的,诀窍是在致电之前开始使用…

  • 我怎么能做到..以编程方式有什么方法可以做到这一点。 Pls救命!