计划任务正在执行或等待执行。
如果任务正在等待执行,future.cancel() 将阻止它被执行(cancel(true)/cancel(false))。
如果任务已经在执行,future.cancel(false) 将无效。 future.cancel(true) 将中断正在执行该任务的线程。 这是否会产生任何影响取决于您,由谁来执行该任务。取决于实现,任务可能会或可能不会响应中断。
为了使您的任务响应取消,您必须实现doSomething() 以便它响应中断。
基本上有两种方法可以做到这一点:
1.检查逻辑中的中断标志
public void doSomething(){
stuff();
//Don't use Thread.interrupt()
if(Thread.currentThread().isInterrupted()){
// We have an interruption request, possibly a cancel request
//Stop doing what you are doing and terminate.
return;
}
doLongRunningStuff();
}
你必须不时检查中断标志,如果被中断,停止你正在做的事情并返回。请务必使用 Thread.isInterrupted() 而不是 Thread.interrupt() 进行检查。
2.对中断异常采取行动
public void doSomething(){
try{
stuff();
}catch(InterruptedException e){
// We have an interruption request, possibly a cancel request
// First, preserve Interrupted Status because InterruptedException clears the
// interrupted flag
Thread.currentThread.interrupt();
// Now stop doing your task and terminate
return;
}
doLongRunningStuff();
}
当你有任何方法抛出 InterruptedException 时,一定要停止你正在做的事情并在抛出一个时终止。
以这种方式实现方法后,您可以调用 future.cancel(true) 来取消正在运行的任务的执行。