26

我正在研究 java 中的 Executors 以一次同时运行更多线程。我有一组可运行对象并将其分配给执行程序。执行程序工作正常,一切都很好。但是在池中执行所有任务之后,java程序没有终止,我认为执行程序需要一些是时候杀死线程了。请任何人帮助我减少执行者在执行所有任务后所花费的时间。

4

2 回答 2

30

ExecutorService类为此有2 个方法:shutdown()shutdownNow()

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

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

于 2009-10-13T18:30:36.917 回答
14

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

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

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

于 2012-04-12T08:58:13.623 回答