如何重置 executorservice.invokeAll() 中的中断标志
How to reset interrupted flag in executorservice.invokeAll()
我了解到在捕获到 InterruptedException 后将 Thread.interrupter() 标志设置回 true
是一种很好的做法。
然而,当我调用 executorService.invokeAll()
并在其周围放置一个 try 子句时,通过捕获 InterruptedException,Thread.currentThread().interrupt()
将正确标记中断线程或我的 controller/runner 的主线程?
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;
}
}
总的来说,这是重置中断标志的正确方法吗?
在此代码示例中,您已给出
try {
executorService.invokeAll(tasks);
} catch (InterruptedException e) {
message = "interrupted";
Thread.currentThread().interrupt();
throw new InternalFailureException(message);
}
调用 Thread.currentThread().interrupt();
的任何人都将设置该线程的标志,在此示例中它将是执行您的 Controller#run()
方法的线程。
理想情况下,执行器由 Task
或 Runnable
负责,由执行器调度以正确处理此标志。
因为它已经是一个已检查的异常 - 它不会给您机会来装饰您将要在执行器中提交的任务,因此您无法轻松控制它。
我了解到在捕获到 InterruptedException 后将 Thread.interrupter() 标志设置回 true
是一种很好的做法。
然而,当我调用 executorService.invokeAll()
并在其周围放置一个 try 子句时,通过捕获 InterruptedException,Thread.currentThread().interrupt()
将正确标记中断线程或我的 controller/runner 的主线程?
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;
}
}
总的来说,这是重置中断标志的正确方法吗?
在此代码示例中,您已给出
try {
executorService.invokeAll(tasks);
} catch (InterruptedException e) {
message = "interrupted";
Thread.currentThread().interrupt();
throw new InternalFailureException(message);
}
调用 Thread.currentThread().interrupt();
的任何人都将设置该线程的标志,在此示例中它将是执行您的 Controller#run()
方法的线程。
理想情况下,执行器由 Task
或 Runnable
负责,由执行器调度以正确处理此标志。
因为它已经是一个已检查的异常 - 它不会给您机会来装饰您将要在执行器中提交的任务,因此您无法轻松控制它。