tutorialspoint threads thread que multi manage implement example java multithreading

threads - Comprender java.lang.Thread.State: WAITING(estacionamiento)



runnable java (4)

Primero, una pregunta realmente tonta, solo me preguntaba qué significaba el "estacionamiento" en espera. ¿El hilo está esperando para ser estacionado o simplemente ha sido estacionado y por lo tanto está en estado de espera? Y cuando ocurre ese estacionamiento, ¿cuántos recursos de CPU / memoria se toman? ¿Cuál es el propósito de estacionar un hilo?

En segundo lugar, mirando el método park en la API de thread java

Desactiva el hilo actual para fines de programación de hilos a menos que el permiso esté disponible.

Si el permiso está disponible, se consume y la llamada vuelve inmediatamente; de lo contrario, el hilo actual se desactiva para fines de programación de hilos y permanece latente hasta que ocurre una de estas tres cosas ...

El inglés no es mi idioma principal, por lo que tengo algunas dificultades para entenderlo. Tuve la intención de ''permitir'' una especie de ''permiso para estacionar el hilo'', por lo que las preguntas que siguen son las siguientes:

  • ¿Cuál es el significado de eso, qué es ''permiso'' y quién y cómo está revisando esos permisos?
  • ¿Qué significa eso: ''si el permiso está disponible, entonces se consume'', se está ''estacionado''?
  • A continuación, si el segundo punto es cierto, ¿cuál es la diferencia entre ''estacionamiento'' y ''permanece inactivo''? Si tengo permiso, puedo estacionarlo para siempre y si no, puedo hacerlo ''inactivo''?

Gracias


De acuerdo con la documentación de estado de subprocesos de java, un subproceso puede ir al estado de ESPERA por tres razones:

  1. Object.wait sin tiempo de espera
  2. Thread.unirse sin tiempo de espera
  3. LockSupport.park

Cuando llamas a un método de estacionamiento en un hilo, deshabilita el hilo para fines de programación de hilos a menos que el permiso esté disponible. Puede llamar al método de desconexión para poner a disposición el permiso para el hilo dado, si aún no estaba disponible.

Entonces, cuando su subproceso está en modo de espera por LockSupport.park, se mostrará como EN ESPERA (estacionamiento).

Por favor, tenga en cuenta que puede llamar al parque solo en el hilo actual. Este es un mecanismo muy útil para implementar el patrón de diseño Productor-Consumidor.


De la descripción de clase (en la parte superior del javadoc LockSupport ) donde describe el permiso:

Esta clase se asocia con cada hilo que lo usa, un permiso (en el sentido de la clase de semáforo). Una llamada al parque regresará inmediatamente si el permiso está disponible, consumiendo [el permiso] en el proceso; de lo contrario, [la llamada a estacionar] puede bloquearse. Una llamada a unpark hace que el permiso esté disponible, si aún no estaba disponible. (Sin embargo, a diferencia de los semáforos, los permisos no se acumulan. Hay como máximo uno).

(Amplié el [texto] para que sea más fácil de leer para personas que no hablan inglés).

Con suerte, alguien con un conocimiento más profundo puede explicar esto. Ver la respuesta de axtavt.

Como nota final, una cita final del javadoc:

Estos métodos están diseñados para ser utilizados como herramientas para crear utilidades de sincronización de alto nivel y no son útiles para la mayoría de las aplicaciones de control de concurrencia.


Permiso significa un permiso para continuar la ejecución. Estacionar significa suspender la ejecución hasta que el permiso esté disponible.

A diferencia de los permisos de Semaphore , los permisos de LockSupport están asociados con hilos (es decir, se otorga un permiso a un hilo en particular) y no se acumulan (es decir, puede haber solo un permiso por hilo, cuando el hilo consume el permiso, desaparece).

Puedes dar permiso a un hilo llamando a unpark() . Un hilo puede suspender su ejecución hasta que el permiso esté disponible (o el hilo se interrumpe, o expira el tiempo de espera, etc.) llamando a park() . Cuando el permiso está disponible, el hilo estacionado lo consume y sale del método park() .


Según lo entiendo, el "permiso" es solo un objeto que representa si un hilo puede ser "desenterrado" o no. Y esto es verificado por el propio Thread (o de JRE cuando intentas estacionar un Thread). La cosa "se consume", entiendo que el permiso desaparece y el Thread no se puede eliminar.

Creo que deberías aprender un poco más sobre el multihilo. Piénsalo como un dispensador con Objetos llamado "permiso". Le dices a un hilo que estacione, y el hilo verifica el dispensador, si hay un "permiso", el hilo lo toma y se va (sin parque). Si no hay un "permiso" en el dispensador, el hilo está estacionado hasta que esté disponible un "permiso" (y usted puede poner un "permiso" en el dispensador con unpark .

En cuanto al uso de CPU / memoria, creo que eso depende del sistema operativo, etc ...