Estoy tratando de comprender cómo funcionan los subprocesos en Java y actualmente estoy investigando cómo implementar subprocesos en bucle que se pueden cancelar. Aquí está el código:Interrumpir subprocesos enlazados en Java
public static void main(String[] args) throws Exception {
Thread t = new Thread() {
@Override
public void run() {
System.out.println("THREAD: started");
try {
while(!isInterrupted()) {
System.out.printf("THREAD: working...\n");
Thread.sleep(100);
}
} catch(InterruptedException e) {
// we're interrupted on Thread.sleep(), ok
// EDIT
interrupt();
} finally {
// we've either finished normally
// or got an InterruptedException on call to Thread.sleep()
// or finished because of isInterrupted() flag
// clean-up and we're done
System.out.println("THREAD: done");
}
}
};
t.start();
Thread.sleep(500);
System.out.println("CALLER: asking to stop");
t.interrupt();
t.join();
System.out.println("CALLER: thread finished");
}
El hilo creo es indentado a ser interrumpido antes o después. Entonces, verifico el indicador Interrumpido() para decidir si necesito continuar y también tomar InterruptedException
para manejar casos cuando estoy en una especie de operación de espera (sleep
, join
, wait
).
cosas que me gustaría aclarar son:
- Es bien usar mecanismo de interrupción para este tipo de tarea? (en comparación con
volatile boolean shouldStop
) - ¿Es correcta esta solución?
- ¿Es normal que trague InterruptedException? Realmente no me interesa cuál era el fragmento de código en el que alguien me pidió que interrumpiera mi hilo.
- ¿Hay formas más breves de resolver este problema? (El punto principal es tener bucle 'infinito')
EDITAR Agregado llamada a interrupt()
de captura para InterruptedException
.
Está bien, pero es mejor no extender el hilo ya que no extiende su funcionalidad. Implementar un Runnable para ser utilizado por un Thread estándar. –