我了解到,在捕获InterruptedException之后,将Thread.interrupter()标志设置回true
是一个好习惯。
但是,当我调用executorService.invokeAll()
并在其周围放置try子句时,通过捕获InterruptedException,Thread.currentThread().interrupt()
会正确地标记中断的线程还是控制器/运行程序的主线程吗?
public class Controller {
public void run() {
final List<Task> tasks = request.collectTasks()
try {
executorService.invokeAll(tasks);
} catch (InterruptedException e) {
message = "interrupted";
Thread.currentThread().interrupt();
throw new InternalFailureException(message);
}
}
}
class Task implements Callable<String> {
@Override
public String call() {
return taskId;
}
}
总的来说,这是重置中断标志的正确方法吗?
答案 0 :(得分:0)
在此代码示例中,您给出了
try {
executorService.invokeAll(tasks);
} catch (InterruptedException e) {
message = "interrupted";
Thread.currentThread().interrupt();
throw new InternalFailureException(message);
}
在本示例中,调用Thread.currentThread().interrupt();
的任何人都将设置该线程的标志,它将是执行Controller#run()
方法的线程。
理想情况下,Task
或Runnable
的职责是由执行者安排在执行者上以正确处理此标志。
由于已经是一个已检查的异常-它不会让您有机会装饰要在执行程序内提交的任务,因此您无法轻松控制它。