如何在java中停止执行Executor ThreadPool?

时间:2009-10-13 18:27:12

标签: concurrent-programming

我正在使用java中的Executors来同时运行更多线程。 我有一组Runnable对象,我将它分配给Exceutors。执行器工作正常 一切都很好。但是在池中执行完所有任务之后,java程序没有终止,我认为Executor需要一些时间来杀死线程。请任何人帮我减少执行程序执行后所花费的时间所有任务。

2 个答案:

答案 0 :(得分:22)

ExecutorService类只有两种方法:shutdown()shutdownNow()

使用shutdown()方法后,可以调用awaitTermination()来阻止,直到所有已启动的任务完成。您甚至可以提供超时以防止永远等待。

您可能想点击我提供的其中一些链接。他们直接进入文档,您可以自己阅读这些内容。

答案 1 :(得分:10)

带有awaitTermination(timeout)的

executor.shutdown()不会杀死线程。 (即),如果您的可运行任务在轮询循环内,它不会终止任务。它只是在达到超时时中断其可运行的任务。因此,在您的runnable类的代码中,如果您在某些条件下等待,您可能希望将条件更改为,

while (flagcondition && !Thread.currentThread().isInterrupted()) {}

这确保当while循环终止时线程被中断时任务停止。或者,您可能希望捕获中断的异常并进行设置 在catch块中使用flag = false来终止线程。

try {
    // do some stuff and perform a wait that might throw an InterruptedException
} catch (InterruptedException e) {
    flagcondition = false;
}

您可能还想使用分析器来检查某些线程未完成的原因。