Запланированная задача либо выполняется или ожидает выполнения.
Если задание ожидает выполнения, то future.cancel()
предотвратит его выполнение (оба отменят (true)/cancel (false)).
Если задача уже выполнена, future.cancel(false)
не будет иметь эффекта. future.cancel(true)
прервет поток, выполняющий эту задачу. Будет ли это иметь какой-либо эффект, зависит от вас, кто выполнит эту задачу. Задача может или не может реагировать на прерывание в зависимости от реализации.
Для того чтобы ваша задача реагировала на отмену, вы должны реализовать doSomething()
так, чтобы она реагировала на прерывание.
Есть в основном два способа сделать это:
1.check флаг прерывания в вашей логике
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.Act на Прерванный исключением
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), чтобы отменить выполнение выполняемой задачи.
Что происходит в doSomething()? –