Una tarea programada o bien se está ejecutando o está a la espera de ser ejecutado.
Si la tarea está esperando a ejecutarse, future.cancel()
impedirá que se ejecute (tanto cancelar (verdadero)/cancelar (falso)).
Si la tarea ya se está ejecutando, future.cancel(false)
no tendrá ningún efecto. future.cancel(true)
interrumpirá el hilo que está ejecutando esa tarea. Si esto tendrá algún efecto depende de usted, quien implementará esa tarea. Una tarea puede o no responder a la interrupción dependiendo de la implementación.
Para que su tarea responda a la cancelación, debe implementar doSomething()
para que responda a la interrupción.
Básicamente, hay dos manera de hacer esto:
1.Verificar bandera de interrupción en su lógica de
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();
}
Debe comprobar de vez en cuando por la bandera de interrupción, y si se interrumpe, detener lo que está haciendo y volver. Asegúrese de utilizar Thread.isInterrupted() y no Thread.interrupt() para el control.
2.Act a excepción interrumpida
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();
}
Cuando usted tiene cualquier método que lanza InterruptedException, asegúrese de dejar lo que hacer y terminar cuando uno se lanza.
Una vez que implemente sus métodos de esta manera, puede llamar a future.cancel (true) para cancelar la ejecución de una tarea en ejecución.
¿Qué está pasando en doSomething()? –