Java 如果不中断,Future.cancel()做什么?
从 试图取消此任务的执行。如果任务已完成、已取消或由于其他原因无法取消,则此尝试将失败。如果成功,并且调用cancel时此任务尚未启动,则此任务不应运行。如果任务已经启动,那么mayInterruptFrunning参数确定执行此任务的线程是否应该被中断,以尝试停止任务 我的问题是,如果MayInterruptFrunning为false,cancel会做什么?Java 如果不中断,Future.cancel()做什么?,java,multithreading,interrupt,future,Java,Multithreading,Interrupt,Future,从 试图取消此任务的执行。如果任务已完成、已取消或由于其他原因无法取消,则此尝试将失败。如果成功,并且调用cancel时此任务尚未启动,则此任务不应运行。如果任务已经启动,那么mayInterruptFrunning参数确定执行此任务的线程是否应该被中断,以尝试停止任务 我的问题是,如果MayInterruptFrunning为false,cancel会做什么? 如果任务已经运行,它如何取消或停止任务的执行?如果它没有中断,它将简单地告诉未来它将被取消。您可以通过检查,但如果不手动检查,则不会发
如果任务已经运行,它如何取消或停止任务的执行?如果它没有中断,它将简单地告诉未来它将被取消。您可以通过检查,但如果不手动检查,则不会发生任何情况 下面的示例代码显示了如何执行此操作
private static FutureTask<String> task = new FutureTask<String>(new Callable<String>() {
@Override
public String call() throws Exception {
while (!task.isCancelled()) {
System.out.println("Running...");
Thread.sleep(1000);
}
return "The End";
}
});
public static void main(String[] args) throws InterruptedException {
new Thread(task).start();
Thread.sleep(1500);
task.cancel(false);
}
private static FutureTask task=new FutureTask(new Callable()){
@凌驾
公共字符串调用()引发异常{
而(!task.isCancelled()){
System.out.println(“正在运行…”);
睡眠(1000);
}
返回“结束”;
}
});
公共静态void main(字符串[]args)引发InterruptedException{
新线程(任务).start();
睡眠(1500);
任务。取消(false);
}
任务开始,并在1.5次迭代后被告知停止。它将继续睡眠(如果你打断它,它就不会这样),然后结束
我的问题是,如果MayFrunning为假,cancel怎么办?
如果任务已经运行,它如何取消或停止任务的执行
如果任务已开始运行,并且maybruptfrunning
为false
,则无需执行任何操作。在Java中,中断线程被认为是在未完成时停止线程的唯一安全方法,即使这样,任务也需要在特定于实现的时间间隔内检查中断来“遵守”
相关:如果任务已经启动并且可能中断fRunning为false,则不会执行任何操作 下面是取消()
我们可以看到,如果MayInterruptFrunning为false,cancel()只需将状态从NEW更改为CANCELLED并返回false,就不会执行其他操作了,但我无法从对象内部“知道”这一点??(未来)请注意,无法检查
isCancelled()
,例如Callable.call
-它只能检查它是否被中断。@PaulBellora请参阅更新的答案。您需要添加一些方法,从可调用的中引用未来的,以使其工作。@zapl好的,但这似乎有点奇怪和自欺欺人while(!Thread.interrupted()){
更有意义。是的,我通常这样做,然后说task.cancel(true)
,因为这可以通过Thread.interrupted()
访问。使用false
您将永远不会得到Thread.interrupted()
返回true,因为它不会中断。我没有发现取消(false)
有多大用处,也没有一种模式可以让您不必使用丑陋的外部引用:)
private static FutureTask<String> task = new FutureTask<String>(new Callable<String>() {
@Override
public String call() throws Exception {
while (!task.isCancelled()) {
System.out.println("Running...");
Thread.sleep(1000);
}
return "The End";
}
});
public static void main(String[] args) throws InterruptedException {
new Thread(task).start();
Thread.sleep(1500);
task.cancel(false);
}
public boolean cancel(boolean mayInterruptIfRunning) {
if (state != NEW)
return false;
if (mayInterruptIfRunning) {
if (!UNSAFE.compareAndSwapInt(this, stateOffset, NEW, INTERRUPTING))
return false;
Thread t = runner;
if (t != null)
t.interrupt();
UNSAFE.putOrderedInt(this, stateOffset, INTERRUPTED); // final state
}
else if (!UNSAFE.compareAndSwapInt(this, stateOffset, NEW, CANCELLED))
return false;
finishCompletion();
return true;
}