2010-03-28 13 views
8

De acuerdo con Java thread state info al llamar a wait() se producirá un thread para ir en estado BLOCKED. Sin embargo, este fragmento de código resultará (después de ser llamado) en un subproceso en estado EN ESPERA.Java Thread wait() => bloqueado?

class bThread extends Thread { 
    public synchronized void run() { 
     try { 
      wait(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 

} 

¿Hay algún error? ¿Alguien puede explicarme este comportamiento? ¡Cualquier ayuda sería apreciada!

+0

Nota al margen: Usted debe asociar su llamada de espera con una condición. – zgulser

Respuesta

15

El hilo está ESPERANDO hasta que se notifique. Luego se BLOQUEA intentando volver a ingresar a la región sincronizada hasta que todos los demás hilos hayan quedado.

partes relevantes desde el enlace que publican (alrededor ESPERA):

Por ejemplo, un hilo que se ha llamado Object.wait() sobre un objeto está a la espera de otro hilo para llamar Object.notify() u Object.notifyAll() en ese objeto.

y (sobre BLOCKED):

un hilo en el estado bloqueado está esperando un bloqueo del monitor para [...] vuelva a introducir un bloque/método sincronizado después de llamar Object.wait.

La última parte se produce cuando el hilo intenta regresar de wait(), pero no hasta entonces.

+0

es eso significa que un hilo bloqueado está en un bucle para obtener el bloqueo? también conocido como un hilo en tiempo de CPU bloqueado costo de estado? – user2807219

+0

@ user2807219: No, normalmente no. El hilo estaría en la lista de espera de un mutex que proteja la región sincronizada, de la misma manera que si estuviera llamando a una función sincronizada que está bloqueada por otro hilo. El costo principal que preocuparse con la contención de bloqueo es típicamente que obliga a cambios de contexto en el programa (es decir, almacenar y restaurar el estado de la rosca de paso en la CPU), que son relativamente costosos. –

1

Esperar es cuando no está haciendo nada. Bloqueado es cuando está intentando comenzar a funcionar nuevamente, pero aún no se le ha permitido.

3

¿Dónde lo viste decir cosas como esa?

En la misma página se ha vinculado, thread.state, se establece claramente que

ESPERA será después Object.wait()

bloqueada sera antes de entrar sincronizada

+0

Oh, veo lo que podría haberte confundido. "BLOCKED => o vuelva a ingresar a un bloque/método sincronizado después de llamar a Object.wait". .. fíjate en "volver a ingresar en un bloque sincronizado" –

9

El monitor se ejecuta en un hilo un momento. Suponiendo que tiene hilos T1-T10, 9 son BLOCKED y uno es RUNNABLE. De vez en cuando, el monitor selecciona un nuevo hilo para ejecutar. Cuando eso sucede, el hilo elegido/actual, digamos T1, va de RUNNABLE a BLOCKED. Luego, otro hilo, por ejemplo, T2, pasa de BLOCKED a RUNNABLE, convirtiéndose en el hilo actual.

Cuando uno de los subprocesos necesita que otro hilo de información esté disponible, utiliza wait(). En ese caso, el hilo se marcará como WAITING hasta que sea notify() ed. Entonces, un subproceso en espera no será ejecutado por el monitor hasta entonces. Un ejemplo sería, espere hasta que haya cajas para descargar. Las cajas de carga me notificarán cuando eso suceda.

En otras palabras, tanto BLOCKED y WAITING son estado de hilos inactivos, pero un hilo WAITING no puede ser RUNNABLE sin ir a BLOCKED primero. WAITING los subprocesos "no desean" para activarse, mientras que los subprocesos BLOCKED "quieren", pero no pueden, porque no es su turno.

Creo.

0

Como recordatorio, siempre debe llamar a wait() dentro de un bucle mientras espera en la condición para entrar en la sección de región/crítico sincronizada. Esto se debe a que Java tiene "activaciones espúreas" (esencialmente, un hilo puede despertarse en cualquier momento sin ningún motivo).

1

Existe cierta terminología confusa pasando aquí. Cuando un hilo llama a esperar en un objeto entra en el estado de ESPERA. Cuando los hilos están esperando para agarrar un candado, pertenecen al esperar establecer para ese bloqueo, pero están en el estado BLOQUEADO.

confuso pero de alguna manera tiene sentido!

Cuestiones relacionadas