English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Introducción detallada del método wait de Object en java

Método wait de java Object

Cuando el hilo B accede a un recurso compartido, desea obtener el objeto candado del recurso, pero encuentra que este candado ya ha sido obtenido por el hilo A. En ese momento, el hilo B solo puede ser suspendido y esperar a que el hilo A libere el candado.

Pero el hilo A que ha obtenido el candado en el proceso de ejecución, debido a que algunas condiciones aún no se satisfacen, no desea continuar ejecutándose temporalmente y desea esperar primero (nota: es el hilo A que ha obtenido el candado que desea activamente esperar), esperando que se cumplan ciertas condiciones para continuar ejecutando la tarea. En el bloque de código sincronizado, el hilo A debe liberar el candado primero, entonces el hilo B tiene derecho a obtener el candado, entrar en el bloque de código sincronizado y ejecutar el código. Después de que el hilo B haya ejecutado, las condiciones necesarias para el hilo A ya se han cumplido, en ese momento debe haber un mecanismo de notificación para que el hilo A pase del estado de espera al estado de ejecución y continúe ejecutando el código.

Algunos estudiantes creen que la thread A también puede seguir iterando y verificando si la condición ya se ha cumplido, sin necesidad de interrumpirse y esperar. En realidad, también es una forma de pensar, pero ¿qué pasa? Es muy consumidor de CPU y no se sabe cuándo se cumplirá la condición.

Para que las threads se coordinen y comuniquen entre sí, debe haber un mecanismo de espera y un mecanismo de notificación, en JAVA, esto se corresponde con los métodos wait y notify.

Método wait de Object

synchronized (obj) {
    while (la condición no es ok){
      obj.wait();
    }
 }

Si desea que la thread A esté en estado de espera, puede llamar al método wait del objeto actual. Una vez que se llama al método wait, significa que la thread A ya ha obtenido el bloqueo y ha hecho todo lo que puede hacer, ahora solo puede esperar, esperando que otras operaciones de sincronización ejecuten algún código después de lo cual volveré a trabajar.

Atención:

El método wait está definido en la clase raíz Object, Thread hereda de la clase Object, por lo que también tiene el método wait. Pero aquí no se llama al método wait del objeto de la thread actual, sino al método wait del objeto actual con propiedades de bloqueo; esto no lo entiendo demasiado, pienso que para que la thread A cambie a estado de espera y luego sea despertada, incluso si se usa el método wait y notify de la thread A también se puede lograr, pero parece que es muy complicado de implementar. Además, desde el punto de vista del escenario, definir wait en Object también es razonable, lo que indica que la thread está en la piscina de espera del objeto.

Gracias por leer, espero que pueda ayudar a todos, gracias por el apoyo a este sitio!

Te gustará