La opción predeterminada correcta es agregar InterruptedException a su lista de lanzamientos. Una interrupción indica que otro hilo desea que su hilo termine. El motivo de esta solicitud no se hace evidente y es completamente contextual, por lo que si no tiene ningún conocimiento adicional, debe asumir que es solo un cierre amigable, y cualquier cosa que evite ese cierre es una respuesta no amigable.
Java no lanzará aleatoriamente InterruptedException, todos los consejos no afectarán su aplicación, pero me he encontrado con un caso en el que los desarrolladores que siguen la estrategia de "tragar" se volvieron muy inconvenientes. Un equipo desarrolló un gran conjunto de pruebas y usó Thread.Sleep mucho. Ahora comenzamos a ejecutar las pruebas en nuestro servidor de CI y, a veces, debido a defectos en el código, quedamos atrapados en esperas permanentes. Para empeorar la situación, al intentar cancelar el trabajo de CI nunca se cerró debido a que Thread.Interrupt que estaba destinado a abortar la prueba no abortó el trabajo. Tuvimos que iniciar sesión en el cuadro y eliminar manualmente los procesos.
En resumen, si simplemente lanza la InterruptedException, está haciendo coincidir la intención predeterminada de que su hilo debería terminar. Si no puede agregar InterruptedException a su lista de lanzamiento, lo envolvería en RuntimeException.
Hay un argumento muy racional para hacer que InterruptedException debería ser una RuntimeException en sí misma, ya que eso fomentaría un mejor manejo "predeterminado". No es una RuntimeException solo porque los diseñadores se apegaron a una regla categórica de que una RuntimeException debería representar un error en su código. Dado que una excepción interrumpida no surge directamente de un error en su código, no lo es. Pero la realidad es que a menudo surge una InterruptedException porque hay un error en su código (es decir, un bucle sin fin, un punto muerto), y la Interrupción es el método de otro hilo para tratar ese error.
Si sabe que hay que realizar una limpieza racional, hágalo. Si conoce una causa más profunda para la interrupción, puede asumir un manejo más integral.
En resumen, sus opciones de manejo deben seguir esta lista:
- Por defecto, agregar a los lanzamientos.
- Si no se permite agregar a los lanzamientos, lanza RuntimeException (e). (La mejor opción de múltiples opciones malas)
- Solo cuando conozca una causa explícita de la Interrupción, maneje como desee. Si su manejo es local para su método, reinicie interrumpido por una llamada a Thread.currentThread (). Interrupt ().