Escena de espera no-noty
La escena típica de Wait-Notify está generalmente relacionada con los siguientes dos contenidos:
1. Variable de estado
Cuando los hilos necesitan esperar, siempre es causado por algunas condiciones. Por ejemplo, llenando la cola, cuando el elemento de cola está lleno, el hilo debe dejar de funcionar. Cuando los elementos de la cola estén vacantes, continúe su propia ejecución.
2. Condicado de condición
Cuando el hilo se determina si ingresa la espera o se despierta de notificar, es necesario probar si se cumplen las condiciones de estado. Por ejemplo, agregando elementos a la cola, la cola está llena, por lo que bloquea el hilo actual. hilo." En este momento, el proceso de esperar el elemento se despertará y luego juzga si realmente hay espacio para la cola actual. SIGUIENTE WATK -UP.
3. Cola de condición
Cada objeto tiene una cola de condición construida.
Aviso
Espere y notifique es una parte importante del mecanismo de sincronización de Java. Combinado con el uso de palabras clave sincronizadas, se pueden establecer muchos modelos síncronos excelentes, como el modelo de consumidor productor. Pero al usar la función function (), notify (), notifyall (), debe prestar especial atención a los siguientes puntos:
Wait (), notificar (), notifyAll () Los métodos no pertenecen a la clase de subprocesos, sino que pertenecen a la clase de base del objeto, es decir, cada objeto tiene las funciones de Wait (), notificar () y notificar (). Debido a que cada objeto está bloqueado, el bloqueo es la base de cada objeto, por lo que el método de bloqueo de operación también es el más básico.
Llame al método Wait () y notify (), debe obtener el bloqueo OBJ, es decir, debe escribirse en el segmento de código sincronizado (obj) {...}.
Después de llamar a obj.wait (), el hilo A libera el bloqueo de OBJ, de lo contrario, el hilo B no puede obtener el bloqueo OBJ, y no podrá despertar el hilo A en el código sincronizado (OBJ) {...} segmento.
Cuando el método obj.wait () regresa, enhebra un enhebrado para obtener el bloqueo OBJ nuevamente para continuar la ejecución.
Si los hilos A1, A2, A3 están en obj.wait (), el hilo B llama obj.notify () solo puede despertar uno de los hilos A1, A2, A3 (que se determina por JVM).
Si el hilo B llama obj.notifyall (), todos pueden despertar el hilo de espera A1, A2, A3, pero el hilo de espera para continuar ejecutando la siguiente oración de obj.wait (), debe obtener un bloqueo OBJ. Por lo tanto, los hilos A1, A2, A3 solo tienen una oportunidad para obtener cerraduras y continuar ejecutando.
Cuando el hilo B llama obj.notify () u obj.notifyall (), el hilo B está sosteniendo el bloqueo OBJ. Hasta que el hilo B salga del bloque de código sincronizado y suelte el bloqueo OBJ, uno en el hilo A1, A2, A3 tiene la oportunidad de obtener el bloqueo del objeto y continuar ejecutando.
Por ejemplo código
La estructura de código típica de la operación de espera del hilo es la siguiente:
public void test () lanza interruptedException {sincronizado (obj) {while (! contidition) {obj.wait ();}}}}}}}}}
¿Por qué las operaciones obj.wait () deben ubicarse en el ciclo? Hay varias razones principales:
1. Un bloqueo de objeto puede usarse para proteger múltiples variables de estado. Por ejemplo, un cierto objeto bloquea OBJ para proteger las dos variables de estado A y B. Cuando no se establecen las condiciones de una afirmación, la operación de espera se produce. Ahora, si se produce una operación de una variable de estado A, la operación de notificación se llama a OBJ, entonces todos los hilos en la cola de condición correspondiente a OBJ. Para B también se despierta en este momento, por lo que debe reciclar si se cumple la condición de B.
2. Se afirman las condiciones del mismo estado de múltiples hilos. Por ejemplo, la escena de agregar elementos a la cola, la cola actual está llena y múltiples hilos quieren agregar elementos dentro, por lo que son todos. En este momento, otro hilo sacó un elemento de la cola y llamó a la operación de notificación para despertar todos los hilos, pero solo un hilo podría agregar un elemento a la cola que otros aún necesitan esperar.
3. Falso despertar. Sin ser notificado, Interrupt Orout, el hilo se despertó automáticamente. Aunque esta situación rara vez ocurre en la práctica, esta situación puede eliminarse a través de la espera del ciclo.