0

我有一个要求,我每天执行多个线程。每个线程都执行一些任务。我要解决的问题是是否使用作为参数传递的停止文件优雅地终止执行程序服务。

我正在使用在线程的运行方法中检查停止文件的方法,但它会对所有剩余的任务进行空运行。相反,我正在寻找一种方法来停止 executorservice 本身的任务。有没有办法做到这一点。

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

有人可以对此进行更多扩展吗?

4

1 回答 1

1

我正在使用在线程的运行方法中检查停止文件的方法,但它会对所有剩余的任务进行空运行。相反,我正在寻找一种方法来停止 executorservice 本身的任务。有没有办法做到这一点。

我认为停止的正确方法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实例。

于 2013-09-19T20:59:33.917 回答