Sí, usted necesita preocúpese por InterruptedException
, del mismo modo que debe preocuparse por cualquier otra excepción comprobada que debe arrojar o manejar.
La mayoría de las veces un InterruptedException
señala una solicitud de detención, muy probablemente debido al hecho de que el hilo que estaba ejecutando el código era interrupted.
En su situación particular de un grupo de conexión esperando para obtener una conexión, diría que este es un problema de cancelación y debe cancelar la adquisición, la limpieza y restaurar el indicador interrumpido (ver a continuación).
A modo de ejemplo, si está utilizando algún tipo de Runnable
/Callable
se ejecuta dentro de un Executor
entonces usted necesita para manejar la InterruptedException correctamente:
executor.execute(new Runnable() {
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
continue; //blah
}
pingRemoteServer();
}
}
});
Esto significaría que su tarea no obedece el mecanismo de interrupción utilizado por el ejecutor y no permite una cancelación/apagado adecuado.
En cambio, el lenguaje adecuado es restaurar el estado interrumpe y luego se detiene la ejecución:
executor.execute(new Runnable() {
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // restore interrupted status
break;
}
pingRemoteServer();
}
}
});
Recursos útiles:
Absolutamente. Para obtener más información, consulte el boletín de especialistas de Java http://www.javaspecialists.co.za/archive/Issue056.html –
¿No debería ser Thread.currentThread(). Interrupt() en lugar de Thread.interrupted()? Según los javadocs, Thread.interrupted() borrará el indicador interrumpido, no lo configurará. –
@Joe: tienes razón, he corregido el ejemplo. Gracias. –