gpt4 book ai didi

java - 如何重置 executorservice.invokeAll() 中的中断标志

转载 作者:行者123 更新时间:2023-12-02 04:49:49 24 4
gpt4 key购买 nike

我了解到,在捕获 InterruptedException 后将 Thread.interrupter() 标志设置回 true 是一个很好的做法。

但是,当我调用 executorService.invokeAll() 并在其周围放置一个 try 子句时,通过捕获 InterruptedException,将正确 Thread.currentThread().interrupt()标记中断的线程,还是我的 Controller /运行器的主线程?

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() 的线程> 方法。

理想情况下,执行程序由 TaskRunnable 负责在执行程序上进行调度,以正确处理此标志。

由于它已经是一个已检查的异常 - 它不会给您机会装饰您将要在执行器内提交的任务,因此您无法轻松控制它。

关于java - 如何重置 executorservice.invokeAll() 中的中断标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56452787/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com