gpt4 book ai didi

java - FutureTask 的自定义取消

转载 作者:搜寻专家 更新时间:2023-11-01 03:44:53 25 4
gpt4 key购买 nike

我已经实现了并发实践中描述的自定义取消逻辑。

Encapsulating nonstandard cancellation in a task with newTaskFor .

这很好用,我可以调用 a future 上的 cancel,任务按预期取消。我需要能够通过调用“shutdownNow”方法来销毁我正在使用的执行程序服务,但此方法只是在线程上调用中断,这意味着我的自定义取消逻辑永远不会被调用。由于我的任务使用非阻塞套接字,中断线程不起作用,因此我有自定义取消逻辑。

是否有一个简单的解决方案来取消所有正在进行的任务。我曾尝试覆盖 ThreadPoolExecutor 上的关闭方法,但我无权访问工作人员列表。我希望能够通过关闭执行器来取消所有操作,因为它在多个地方用于提交任务,有没有简单的解决方案?

最佳答案

正如 John 所指出的,如果您可以让您的任务可中断,那将是最好的。然后您可以简单地依靠 ThreadPoolExecutor 来中断所有工作线程以进行有序取消。

如果那不可能,您可以在 ThreadPoolExecutor 中添加额外的逻辑来实现您想要的。它有点复杂,对某些人来说可能不太好(并且可能会稍微影响性能),但我认为它会完成工作。我认为基本上你需要自己维护一个 Activity 任务列表。关键是重写 beforeExecute() 和 afterExecute() 方法:

public class MyExecutor extends ThreadPoolExecutor {
private final Queue<RunnableFuture> activeTasks =
new LinkedBlockingQueue<RunnableFuture>();
...

protected void beforeExecute(Thread t, Runnable r) {
RunnableFuture task = (RunnableFuture)r;
activeTasks.add(task);
}

protected void afterExecute(Thread t, Runnable r) {
RunnableFuture task = (RunnableFuture)r;
activeTasks.remove(task);
}

public void cancelAllActiveTasks() {
for (RunnableFuture f: activeTasks) {
f.cancel(true); // invokes your custom cancellation logic
}
}

您也可以调用 cancelAllActiveTasks() 或覆盖 shutDownNow() 来调用它。我不喜欢的一件事是必须从队列中删除任务,因为它不是恒定时间操作。

关于java - FutureTask 的自定义取消,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4033096/

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