2008-10-22 9 views
25

Soy relativamente nuevo en Threading en Java y he notado que cada vez que uso Thread.sleep() tengo que atrapar InterrupetdException.¿Qué tipo de comportamiento causa una excepción interrumpida?

¿Qué tipo de comportamiento causa esto, y en aplicaciones simples donde tengo un subproceso de monitor puedo simplemente Ignorar la excepción?

+0

similares a esta pregunta: http://stackoverflow.com/questions/17494717/why-a-thread-would-interrupt-another-thread/17495107#17495107 –

Respuesta

-3

Bueno, si algún otro subproceso llama a thread.interupt(), mientras el subproceso está inactivo, obtendrá la excepción. Y sí, probablemente solo puede poner try..catch en el sleep() e ignorarlo;)

+19

retrocedido porque usted debe * * Nunca ignorar cualquier excepción, esto lleva a comportamientos y errores no documentados. Puede iniciar sesión o hacerla burbujear. –

+0

Ingerir una interruptedException pone en peligro la capacidad de una aplicación para cancelar actividades o cerrarla en una información oportuna. Más información aquí http://www.ibm.com/developerworks/library/j-jtp05236/ –

+0

Si bien definitivamente no se debe ignorar la mayoría de las excepciones. Este es un excelente ejemplo de una excepción que puede ser ignorada en algunos casos. Por ejemplo, cuando la referencia al subproceso solo existe en el alcance, entonces no hay un comportamiento inesperado posible. Somos Ingenieros de Software y se supone que debemos pensar por nosotros mismos. Si ni siquiera se pregunta por qué es una buena práctica manejar excepciones, probablemente sea un mal ingeniero. –

3

El caso principal es cuando alguien llama al Thread.interrupt() en su hilo.

Puede ser más seguro lanzar una RuntimeException si ocurre cuando realmente no la está esperando, pero para casos muy simples, probablemente pueda ignorarla.

-1

InterruptedException es una excepción marcada por lo que lamentablemente no puede simplemente ignorarla. En la mayoría de los casos simples, no tiene que hacer nada en la cláusula de captura porque está seguro de que no sucederá.

Desde el API

lanza cuando un hilo está esperando, dormir, o de otra manera se detuvo por un largo tiempo y otro hilo interrumpe utilizando el método de interrupción en la clase Thread.

3

Desde el javadocs:

Clase InterruptedException

lanza cuando un hilo está esperando, dormir, o de lo contrario se detuvo un mucho tiempo y otro hilo interrumpe el uso el método de interrupción en la clase Tema.

Espero que responda a tu pregunta.

5

Como han dicho otros, es causado por otro hilo que llama al interrupt() en el objeto Thread que está durmiendo.

Lo que esto significa en inglés simple, es que algún otro hilo ha decidido cancelar el hilo de dormir. El bloque try/catch está ahí para que pueda manejar con gracia la cancelación del hilo, y limpiar de manera segura cualquier recurso, o cerrar cualquier operación que esté haciendo correctamente.

Si realmente no necesita hacer nada de eso, entonces sí, todavía necesita un bloque catch vacío. Pero eso es Java para usted ...

23

Ocurre cuando algo llama a interrupt() en el hilo. This article by Brian Goetz explica el mecanismo de interrupción y cómo se debe manejar InterruptedExceptions:

"La respuesta más común a InterruptedException es que tragar - atraparlo y no hacer nada (o tal vez iniciar la sesión, lo que no es mejor) - - como veremos más adelante en el Listado 4.Desafortunadamente, este enfoque arroja información importante sobre el hecho de que se produjo una interrupción, que podría comprometer la capacidad de la aplicación de cancelar actividades o cerrar de manera oportuna. "

" Si detecta InterruptedException pero no puede volver a lanzarlo, debe preservar la evidencia de que la interrupción ocurrió [...]. Esta tarea se realiza llamando interrupción() a "reinterrupt" el subproceso actual "

+2

Gracias por mencionar este punto. Es un PITA tener que gestionar InterruptedExceptions, pero es importante. –

6

Algunos consejos de Java concurrencia en la práctica:.

  • propagar la excepción (posiblemente después de alguna tarea específica limpieza), haciendo que su método también sea un método de bloqueo interrumpible; o
  • Restaurar el estado de interrupción para que el código más arriba en la pila de llamadas pueda manejarlo
  • Código único que implementa una política de interrupción de subprocesos puede tragar una solicitud de interrupción. La tarea de propósito general y el código de la biblioteca nunca deben tragar las solicitudes de interrupción.
Cuestiones relacionadas