我有一个要求,我每天执行线程数。每个线程都做一些任务。我试图解决的问题是如果使用作为参数传递的stopfile优雅地终止执行程序服务。
我正在使用在线程的run方法中检查stopfile的方法,但它将为所有剩余的任务执行空运行。相反,我寻找一种方法来停止执行器服务本身的任务。有没有办法做到这一点。
我正在看这篇文章:Removing all queued tasks of an ThreadPoolExecutor
有人可以进一步扩展吗?
答案 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
个实例。