Java 如果不中断,Future.cancel()做什么?

Java 如果不中断,Future.cancel()做什么?,java,multithreading,interrupt,future,Java,Multithreading,Interrupt,Future,从 试图取消此任务的执行。如果任务已完成、已取消或由于其他原因无法取消,则此尝试将失败。如果成功,并且调用cancel时此任务尚未启动,则此任务不应运行。如果任务已经启动,那么mayInterruptFrunning参数确定执行此任务的线程是否应该被中断,以尝试停止任务 我的问题是,如果MayInterruptFrunning为false,cancel会做什么? 如果任务已经运行,它如何取消或停止任务的执行?如果它没有中断,它将简单地告诉未来它将被取消。您可以通过检查,但如果不手动检查,则不会发

试图取消此任务的执行。如果任务已完成、已取消或由于其他原因无法取消,则此尝试将失败。如果成功,并且调用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;
}