¿Qué es Esperar y notificar en Java?



Wait y Notify en Java son los dos métodos finales que permiten que los subprocesos se comuniquen entre sí. Este artículo te ayudará con los detalles.

La característica en Java permite la ejecución concurrente de dos o más partes de un programa. Cada parte es un hilo. Estos hilos a menudo tienen que coordinar sus acciones. Esto se hace usando algunos métodos finales como Wait y Notify en Java. Este artículo lo ayudará a comprender estos métodos en detalle.

Hablaré de los temas en el siguiente orden:





¡Vamos a empezar!

¿Qué es la sincronización de subprocesos?

Los programas de subprocesos múltiples pueden presentar regularmente una situación en la que Intente llegar al mismo recurso que produce resultados fraudulentos y sorprendentes. A veces, más de un subproceso puede intentar acceder a un recurso compartido, debe asegurarse de que el recurso sea utilizado por un solo subproceso a la vez. Esto se puede hacer usando Sincronización en Java.



Ahora hablando de Polling. El sondeo es un proceso de prueba de una condición repetidamente hasta que es verdadera. Este método se implementa con la ayuda de para comprobar si una condición particular es verdadera o no. Puede usar este método para subprocesos, pero este método desperdicia muchos ciclos de CPU y también hace que el proceso de implementación sea muy ineficiente. Para evitar este tipo de errores, se introducen métodos como Wait y Notify en Java.

¿Qué son los métodos Wait () y Notify ()?

Para abordar el problema de subprocesos múltiples, métodos como Wait y Notify in son usados. La clase Object utiliza estos tres métodos finales que permiten que los subprocesos se comuniquen sobre el estado bloqueado de un recurso. También se denominan bloques vigilados.

pl tutorial de sql con ejemplos

Espere()

Este método hace que el hilo espere hasta que otro hilo invoca los métodos notificar () y notificar a todos () para este objeto. Este método Wait () le dice al hilo de llamada que suelte un bloqueo y se vaya a dormir hasta que otro hilo entre en el mismo monitor y llame a notificar (). Este método libera el bloqueo antes de esperar y vuelve a adquirir el bloqueo antes de regresar del método wait ().



El método Wait () está estrechamente integrado con el bloqueo de sincronización. Esto se hace utilizando una función que no está disponible directamente desde el mecanismo de sincronización.

Sintaxis:

sincronizado (lockObject) {while (! condition) {lockObject.wait ()} // tome la acción aquí}

El hilo actual debe ser propietario del monitor de su objeto. Debe llamarse solo desde el método sincronizado o de lo contrario lanzará una excepción.

Notificar()

Este método se utiliza para notificar al que necesita para funcionar. Despierta un hilo que llamó al Espere() método en el mismo objeto.

Tenga en cuenta que llamando notificar() eventualmente no cede un candado. Le dice a un hilo en espera que puede despertar. Sin embargo, el bloqueo no se abandona realmente hasta que se completa el bloqueo sincronizado del notificador. Ahora di, si llamas notificar() en un recurso pero el notificador aún necesita realizar acciones durante 10 segundos dentro de su bloque sincronizado, el hilo que había estado esperando tendrá que esperar al menos otros 10 segundos adicionales para que el notificador libere el bloqueo en el objeto, aunque notifique () había sido llamado.

Sintaxis:

sincronizado (lockObject) {// establecer_la_condición lockObject.notify () // cualquier código adicional si es necesario}

NotifyAll ()

Este método se usa para despertar todos los hilos que llamaron a wait () en el mismo objeto. El subproceso de mayor prioridad se ejecutará primero en la mayoría de las situaciones aunque no esté garantizado. Otras cosas son las mismas que el método notify ().

¿Por qué y cómo usar Wait () y Notify () en Java?

Debe usar Esperar y notificar en porque están relacionados con el bloqueo y el objeto tiene un bloqueo. Aunque esperar y notificar en Java es un concepto bastante fundamental, se definen en el clase de objeto . Sorprendentemente, no es tan fácil escribir el código usando esperar y notificar. Puede probar esto escribiendo código para resolver el problema productor-consumidor usando esperar y notificar. Ejemplo de consumidor productor: espere y notifique en Java-EdurekaAquí tengo un compartido Cola ydos hilosllamado Productor y Consumidor . Productor hilo pone el número en una cola compartida y Consumidor el hilo consume los números del depósito compartido.

La condición es que una vez que se produce un artículo, se debe notificar al hilo del consumidor y, de manera similar, se debe notificar al hilo del productor de consumo. Este inter-hilocomunicaciónse logra usando esperar y notificar en Java.

Nota : W.ait y notify métodos se definen en la clase de objeto, y deben llamarse dentro del bloque sincronizado.

Ejemplo

public class Thread1 {public static void main (String [] args) {Thread2 b = new Thread2 () b.start () synchronized (b) {try {System.out.println ('Esperando que 2 se complete ...' ) b.wait ()} catch (InterruptedException e) {e.printStackTrace ()} System.out.println ('El total es:' + b.total)}}} class Thread2 extiende Thread1 {int total @Override public void run () {sincronizado (esto) {para (int i = 0 i<=100 i++) { total += i } notify() }}}

Observe que en el ejemplo anterior, un objeto de Thread2, es decir b, está sincronizado. Este b completa el cálculo antes de que el hilo principal emita su valor total.

Salida:

Esto nos lleva al final de este artículo donde hemos aprendido las en Esperar y notificar en Java.Espero que el contenido mencionado anteriormente haya resultado útil para mejorar su conocimiento. ¡Sigue leyendo, sigue explorando!

También echa un vistazo por Edureka, una empresa de aprendizaje en línea de confianza con una red de más de 250.000 alumnos satisfechos repartidos por todo el mundo. El curso de certificación y capacitación Java J2EE y SOA de Edureka está diseñado para estudiantes y profesionales que desean ser desarrolladores de Java. El curso está diseñado para darle una ventaja en la programación de Java y capacitarlo para los conceptos básicos y avanzados de Java junto con varios como Hibernate y Spring.