2011-11-09 38 views
5

Teniendo en cuenta el hecho de que espere() sólo puede ser llamado en un contexto sincronizado que posteriormente liberar el monitor hasta un notify/nofityAll ha sido llamada en el mismo objeto por otro hilo,¿Qué sucede cuando un hilo se interrumpe mientras se bloquea en una espera()?

Supongamos Tema A se bloquea en una espera() que da como resultado que el hilo B adquiere el bloqueo. Ahora si interrumpimos el hilo A, ¿el control se transferirá inmediatamente al hilo A? en cuyo caso, dado que el bloque try catch que maneja la InterrupException está dentro del contexto sincronizado, y dado que solo un Thread puede contener el monitor a la vez, ¿qué sucederá con el Thread B? ¿debería pasar a un estado bloqueado hasta que el hilo A haya terminado la ejecución?

Gracias de antemano

Respuesta

8

Leer la documentación tiene de hecho ayuda:

http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Object.html#wait%28long%29

Por lo tanto, cuando el hilo se interrumpe, se tiene que volver a adquirir el monitor del objeto de restablecer el estado de sincronización antes de que se produce la excepción. Lo mismo vale para regresar de la llamada de espera (larga) una vez transcurrido el tiempo especificado.

El subproceso T se elimina del conjunto de espera para este objeto y vuelve a habilitarse para la programación de subprocesos. Luego compite de la manera habitual con otros hilos para el derecho de sincronizar en el objeto; una vez que ha obtenido el control del objeto, todas sus reclamaciones de sincronización en el objeto se restauran al status quo ante, es decir, a la situación a partir del momento en que se invocó el método de espera. El hilo T luego regresa de la invocación del método de espera. Por lo tanto, en el retorno del método de espera, el estado de sincronización del objeto y del hilo T es exactamente como lo era cuando se invocaba el método de espera.

Si el hilo actual es interrumpido por otro hilo mientras está esperando , se lanza una excepción InterruptedException. Esta excepción no es lanzada hasta que el estado de bloqueo de este objeto se haya restaurado como descrito anteriormente.

+0

+1. Busqué en el documento para wait() (sin argumento), y no fue mencionado (y no había ningún enlace al método de espera sobrecargado). Demasiado. –

+0

¡ah! No veo la explicación en el documento 6 de java http://bit.ly/tNJ1VT. de todos modos, en ese caso, supongo que el Hilo A DEBE volver a verificar el predicado de condición al recibir la Excepción antes de continuar –

+0

@arun_suresh: Como dije, está en la espera (larga) javadoc: http://download.oracle.com/javase /6/docs/api/java/lang/Object.html#wait%28long%29. Normalmente se usa una interrupción para detener un hilo. Entonces, por lo general, no sigues adelante. –

2

creo que se convertirá en un ejecutable, pero esperará hasta que pueda adquirir el bloqueo antes de proceder con la cláusula catch. No forzará a B a un estado bloqueado. El objetivo de un bloque sincronizado es que el hilo que sujeta el bloqueo tenga garantizado que ningún otro hilo pueda sincronizarse en el mismo bloqueo hasta que abandone su bloqueo; forzar a B a un estado bloqueado y dejar que A readquirir el bloqueo violaría la esencia misma de la sincronización.

Cuestiones relacionadas