如何使用stopfile方法优雅地停止执行程序服务

时间:2013-09-19 20:56:39

标签: java multithreading executorservice

我有一个要求,我每天执行线程数。每个线程都做一些任务。我试图解决的问题是如果使用作为参数传递的stopfile优雅地终止执行程序服务。

我正在使用在线程的run方法中检查stopfile的方法,但它将为所有剩余的任务执行空运行。相反,我寻找一种方法来停止执行器服务本身的任务。有没有办法做到这一点。

我正在看这篇文章:Removing all queued tasks of an ThreadPoolExecutor

有人可以进一步扩展吗?

1 个答案:

答案 0 :(得分:1)

  

我正在使用在线程的run方法中检查stopfile的方法,但它将为所有剩余的任务执行空运行。相反,我寻找一种方法来停止执行器服务本身的任务。有没有办法做到这一点。

我认为停止ExecutorService的正确方法是在其上使用executorservice.shutdownNow();方法。这将取消所有尚未运行的作业,并将中断所有正在运行的线程。

要测试中断,您的任务应该执行以下操作:

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

你抓住InterruptedException的任何地方,你需要确保重新启用中断标志:

try {
    // something that throws InterruptedException
} catch (InterruptedException e) {
    Thread.currentThread().interrupt();
    // maybe we should quit the thread here
}

如果您使用的第三方库可能会占用InterruptedException,那么您可能必须使用取消作业的executorservice.shutdown(),但中断线程。然后你应该分享某种volatile boolean shutdown标志(或AtomicBoolean)并在你的运行方法中做一些事情:

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

顺便说一下,你提到了“线程的运行方法”。确定,您应该实施Runnable并将其提交给ExecutorService。您不应该提交Thread个实例。