El mecanismo de interrupción de subprocesos es la forma preferida de conseguir que un subproceso (cooperante) responda a una solicitud para detener lo que está haciendo. Cualquier hilo (incluido el hilo en sí, creo) podría llamar interrupt()
a un hilo.
En la práctica, los casos de uso normales interrupt()
involucran algún tipo de marco o administrador que le dice a algún hilo de trabajo que detenga lo que están haciendo. Si el hilo de trabajo es "consciente de la interrupción", notará que ha sido interrumpido a través de una excepción, o verificando periódicamente su indicador de interrupción. Al darse cuenta de que ha sido interrumpido, un hilo de buen comportamiento abandonará lo que está haciendo y se acabará.
Suponiendo el caso de uso anterior, es probable que su código se interrumpa si se ejecuta dentro de un marco de Java o desde algún hilo de trabajo. Y cuando se interrumpe, su código debe abandonar lo que está haciendo y provocar su finalización por los medios más adecuados. Dependiendo de cómo se haya llamado su código, esto podría hacerse regresando o lanzando alguna excepción apropiada. Pero probablemente no debería llamar System.exit()
. (Su aplicación no necesariamente sabe por qué fue interrumpida, y ciertamente no sabe si hay otros subprocesos que deben ser interrumpidos por el marco).
Por otro lado, si su código no está diseñado para ejecutarse bajo el control de algún marco, podría argumentar que InterruptedException
es una excepción inesperada; es decir, un error. En ese caso, debe tratar la excepción como lo haría con otros errores; por ejemplo, envuélvalo en una excepción sin marcar, y captúrelo y regístrelo en el mismo punto en el que trata con otras excepciones inesperadas sin marcar. (Alternativamente, su aplicación podría simplemente ignorar la interrupción y continuar haciendo lo que estaba haciendo).
1) Si nunca estoy interrumpiendo otros hilos, ¿qué puede desencadenar una InterruptedException?
Un ejemplo es si sus Runnable
objetos se ejecutan usando un ExecutorService
y shutdownNow()
se llama en el servicio. Y, en teoría, cualquier grupo de subprocesos de terceros o marco de gestión de subprocesos podría hacer legítimamente algo como esto.
2) Si nunca voy a interrumpir otros hilos usando interrupt () ... ¿qué significa InterruptedException
entonces? ¿Qué se supone que debo hacer al atrapar uno? ¿Apagar mi aplicación?
Necesita analizar la base de código para averiguar qué está haciendo las interrupt()
llamadas y por qué. Una vez que se haya dado cuenta de eso, puede averiguar qué >> debe hacer su << parte de la aplicación.
Hasta que sepa por qué InterruptedException
se está lanzando, le aconsejaría tratarlo como un error grave; por ejemplo, imprima un seguimiento de pila en el archivo de registro y cierre la aplicación. (Obviamente, esa no siempre es la respuesta correcta ... pero el punto es que esto es "un error", y debe notificarse al desarrollador / mantenedor).
3) ¿Cómo puedo saber quién / qué está llamando interrupt()
?
No hay una buena respuesta a esto. Lo mejor que puedo sugerir es establecer un punto de interrupción en el Thread.interrupt()
y mirar la pila de llamadas.