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

Java 如何关闭ExecutorService可运行程序的多个实例?,java,multithreading,runnable,executorservice,future,Java,Multithreading,Runnable,Executorservice,Future,我试图理解如何处理执行Runnable命令的ExecutorService的许多实例。关于提供的代码,如果我在固定线程池设置为1的情况下执行100个Runnable,需要多少次关闭?我认为代码应该按照for循环的执行顺序顺序执行一百个futures,一个线程不会产生超过一个线程,并且需要关闭一个ExecutorService。这是正确的吗?另外,在for循环完成后立即调用shutdown也是可以的,因为所有一百个未来都在队列中,所以在所有一百个未来完成后,executorService将自动关闭

我试图理解如何处理执行Runnable命令的ExecutorService的许多实例。关于提供的代码,如果我在固定线程池设置为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();
}   

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

try {
    executorService.awaitTermination(5, TimeUnit.MINUTES);
} catch (InterruptedException e) {
    // do stuff
}
根据您的使用场景,在所有任务完成时阻止


如果要关闭并尝试终止所有正在运行的任务,请调用shutdownNow方法。请注意,不能保证它能够中断正在运行的任务。

好的,谢谢。您知道在执行for循环一百次而不是只执行一次Runnable的情况下,内存占用在内部会发生什么吗?当fixed thread pool设置为1时,Executor Service队列的增长是否会有很大的开销,以使其保留顺序执行?使用线程池更有效,因为创建实际线程的成本很高,但相比之下,创建在该线程上执行的可运行程序的成本可以忽略不计。正如我重新阅读您的问题时,我觉得我应该指出,排队等待运行的可运行程序越多,它们占用的内存就越多。这可能是显而易见的,但如果您构建大量可运行程序的速度快于池的执行速度,则在某些环境中可能会遇到OutOfMemory错误。