gpt4 book ai didi

java - 我是否必须在 FutureTask 中手动处理中断?

转载 作者:行者123 更新时间:2023-12-04 08:01:59 26 4
gpt4 key购买 nike

我目前正试图了解如何 FutureTask.cancel(true)正在工作,这是官方文档的相关部分

If the task has already started, then the mayInterruptIfRunning parameter determines whether the thread executing this task should be interrupted in an attempt to stop the task.


这是 cancel的实现摘自 Github
public boolean cancel(boolean mayInterruptIfRunning) {
if (!(state == NEW &&
UNSAFE.compareAndSwapInt(this, stateOffset, NEW,
mayInterruptIfRunning ? INTERRUPTING : CANCELLED)))
return false;
try { // in case call to interrupt throws exception
if (mayInterruptIfRunning) {
try {
Thread t = runner;
if (t != null)
t.interrupt();
} finally { // final state
UNSAFE.putOrderedInt(this, stateOffset, INTERRUPTED);
}
}
} finally {
finishCompletion();
}
return true;
}
所以,基本上我们可以看到唯一的东西 cancel(true)正在做的是打电话 interrupt在工作线程上。那么,如果 call我的方法 FutureTask看起来像这样
SomeType call() {
for(int i = 0; i < 1000000000; i++) {
//pass
}
return someValue;
}
所以,我的问题 - 我是否必须添加手动检查线程中断才能取消这种类型的 FutureTasks ?我的意思是这似乎很明显,因为我没有调用任何可以处理中断的 IO 函数,也没有检查 Thread.currentThread().isInterrupted() ,所以这个任务似乎是不可取消的,但是在任何官方文档中仍然没有提到我们必须处理中断或自我才能取消任务,所以最好问问别人的意见。

最佳答案

Java 中没有先发制人。对于任何可中断的事物,它都必须合作。所以是的,任务必须检查它是否被中断,否则即使 future 被取消,它也会运行到最后。令人失望,我知道。

关于java - 我是否必须在 FutureTask 中手动处理中断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66420192/

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