0

有问题的如何使线程超时,建议的解决方案适用于ExecutorService该类,其中可以提交Runnable要执行的对象。

该类ExecutorService提供了两种方法shutdownshutdownNow停止所有任务的执行。但是 Java API 说shutdownNow

“尝试停止所有正在执行的任务,停止等待任务的处理,并返回等待执行的任务列表。除了尽力停止处理正在执行的任务之外,没有任何保证。例如,典型的实现将通过 Thread.interrupt() 取消,因此任何无法响应中断的任务都可能永远不会终止。”

我想知道,如果没有办法执行有保证的任务终止?

4

3 回答 3

1

如果任务的实现超出了您的控制范围,那么答案是否定的。

任务的实现者有责任并有能力提供一种终止方式。没有它,甚至System.exit(-1)可能没有效果,如果任务打开了一个守护线程......

于 2012-09-05T19:16:15.153 回答
0

唯一的方法是使用已弃用的 Thread.stop(),但出于充分的理由已弃用它,不应使用它。

所以答案是否定的:没有这个任务协作就没有办法停止一个任务。如果任务即使被要求停止也拒绝停止,则什么也做不了。

于 2012-09-05T19:14:34.280 回答
0

这是可能的,但是你必须尊重很多事情:

1) 您必须确保正确处理 InterruptedException,例如没有下沉

2) 你必须检查线程状态,例如调用 Thread.interrupted

3) 测试后恢复线程的中断状态

4) 考虑在每个自定义 I/O 方法或循环中咨询此内容(如果适用)

我建议阅读“Java 并发实践”,这本很棒的书包含专门用于纠正线程中断并保证事情按预期工作的整章。

于 2012-09-05T19:24:48.347 回答