2010-02-18 20 views
9

Cuando se invoca un Thread.interrupt() en un subproceso, ¿qué ocurre con ese subproceso?Cuando se invoca un Thread.interrupt() en algún hilo, ¿qué ocurre?

+1

¿Puede ser más específico? Me parece que la documentación habla muy bien de ello: http://java.sun.com/javase/6/docs/api/java/lang/Thread.html # interrupt() Supongo que hay algo que no está dejando en claro, sin embargo, si puede refinar su pregunta? –

Respuesta

30

El hilo de destino está "interrumpido". En su mayoría, se establece un indicador en ese hilo, que el hilo puede ver (con Thread.interrupted()). Si el hilo de destino estaba actualmente bloqueado en algunas E/S o Object.wait(), se activa con, respectivamente, un InterruptedIOException o un InterruptedException.

La interrupción de subprocesos es una forma suave de empujar un hilo. Se usa para darles la oportunidad a los hilos de salir limpiamente, a diferencia de Thread.stop(), que es más como disparar el hilo con un rifle de asalto.

+1

'InterruptedIOException' es improbable que sea una práctica. La E/S interrumpible se habilitó en Solaris brevemente, pero simplemente no lo vale. Por supuesto, la implementación es específica de la implementación. Normalmente (en los últimos tiempos) el sistema operativo tendrá algo que ver con los hilos. –

+7

+1 para la explicación de usted y la comparación de disparos. – helios

2

Aquí es el JDK 1.6 Javadoc:

interrumpe este hilo.

A menos que el hilo actual es interrumpir sí, que siempre está permitido, el método de checkAccess se invoca este hilo, que puede causar una SecurityException para ser lanzado .

Si este hilo se bloquea en un invocación de la espera(), esperar (largo), o esperar (largo, int) métodos de la clase objeto, o de la unión(), unirse (long), join (long, int), sleep (long), o sleep (long, int), métodos de esta clase, entonces su estado de interrupción se borrará y recibirá InterruptedException.

Si este hilo se bloquea en un/O operación de E sobre un canal interrumpible entonces el canal será cerrado, de estado de interrupción de la rosca se establecerá, y el hilo se recibir un ClosedByInterruptException.

Si este hilo se bloquea en un selector entonces estado de alarma del hilo se puede ajustar y volverá inmediatamente de la operación de selección , posiblemente con un cero no valor, como si del selector de despertar método fue invocado.

Si no se cumple ninguna de las condiciones previas , se activará el estado de interrupción de este hilo.

La interrupción de un hilo que no es vivo no necesita tener ningún efecto.

0

ZeissS es correcto, la señalización es la forma más limpia de hacerlo. también puede atrapar la excepción de interrupción y limpiar de esa manera.

Cuestiones relacionadas