¿Entiende realmente los distintos estados de los hilos?

Introducción al estado del hilo

Aquí estamos hablando del estado de los hilos en Java.

El estado del hilo es el siguiente:

"
  • Estado inicial del hilo:NEW

  • Estado de ejecución del hilo:RUNNABLE

  • Estado de bloqueo del hilo:BLOCKED

  • Estado de espera del hilo:WAITING

  • Estado de espera de tiempo de espera:TIMED_WAITING

  • Estado de terminación del hilo:TERMINATED

"

El estado de espera debería ser un estado más complejo e importante.

El hilo entra en estado de espera, es decir, el hilo renuncia al derecho de usar la CPU por alguna razón, y el bloqueo también se divide en varias situaciones:

  • Esperando bloqueo: el waitmétodo de ejecución del hilo en ejecución , JVM colocará el hilo actual en la cola de espera

  • Bloqueo síncrono: cuando el subproceso en ejecución adquiere el bloqueo de sincronización del objeto, si el bloqueo de sincronización está ocupado por otros bloqueos de subproceso, la JVM colocará el subproceso actual en el grupo de bloqueos

  • Otro bloqueo: cuando se ejecuta un subproceso en ejecución Thread.sleepo joinse emite un método, o se emite una solicitud de E / S, la JVM establecerá el subproceso actual en un estado bloqueado. Cuando el subproceso sleepfinal jointermina y se completa el procesamiento de E / S, el subproceso se reanuda

La transición entre estados de hilo es la siguiente:

A continuación explicaré qué situaciones entrarán en estos estados.

El estado del hilo al dormir

resultado de la operación

new t1 t1 的状态:NEW
t1 running is false,t1将sleep
t1.sleep()时的状态:TIMED_WAITING

Analicemos cuándo new Thread, el estado del hilo t1 [Thread-0] es NUEVO. El subproceso se inicia, ejecuta el run()método y se imprime t1 running is false,t1将sleepEn este momento, el subproceso t1 duerme. Luego, el hilo principal duerme y la variable se runningestablece en false. Este hilo t1 todavía está durmiendo. Vuelva a poner el hilo principal en reposo y el hilo t1 seguirá durmiendo. El estado del hilo t1 en este momento es TIMED_WAITING.

Si modificamos el tiempo de reposo en el hilo t1

Thread.sleep(10000L);  -> Thread.sleep(3000L);

Echemos un vistazo a los resultados.

new t1 t1 的状态:NEW
t1 running is false,t1将sleep
t1.sleep()时的状态:TERMINATED

El subproceso t1 termina, así que cuando mires el código, no pienses que sleep()es un estado de espera de tiempo de espera [TIMED_WAITING]. Para ver si el hilo ha terminado.

El estado en el que se une el hilo

Los resultados son los siguientes

t2中执行t1.join(5000L)
t2的状态:TIMED_WAITING
t2中执行t1.join()
t2的状态:WAITING
t2执行完

Cuando se ejecuta

t1.start();
t2.start();

El subproceso t1 duerme, ingresa al subproceso t2 en este momento y se ejecuta t2中执行t1.join(5000L). A continuación, t1 se adelantará, ingresará el hilo principal y el hilo principal duerme. En este momento, t2 todavía está esperando t1, por lo que el estado del hilo de t2 es [TIMED_WAITING]. En este momento, el subproceso principal vuelve a dormir y la ejecución comienza en t1.join()t2.En este momento, el estado de t2 es [ESPERANDO].

El estado del hilo cuando está sincronizado

Veamos los resultados

t1抢不到锁的状态:BLOCKED
t1抢到锁

El hilo principal comienza y primero agarra el candado. En este momento, t1.start()se inicia el subproceso t1. En este momento, el subproceso principal está inactivo y el bloqueo no se ha liberado. El estado de t1 en este momento es [BLOQUEADO].

El estado del hilo cuando está en espera.

resultado de la operación

t1将wait(1000L)
t1的状态:TIMED_WAITING
t1的状态:BLOCKED
t1将wait
t1的状态:WAITING
t1将执行完
t1的状态:RUNNABLE
t1的状态:TERMINATED

El subproceso principal se inicia, se ejecuta t1.start(), ingresa t1, se ejecuta t1将wait(1000L)y luego t1 abandona el bloqueo. Mientras t1 espera un tiempo de espera, el hilo principal duerme. Después de eso, el hilo principal aquí toma el bloqueo, y el estado de t1 es [TIMED_WAITING]. En este momento, el subproceso principal se ejecuta object.notify(), pero el bloqueo aún no se ha liberado y t1 aún no ha adquirido el bloqueo, por lo que el estado de t1 es [BLOQUEADO]. Después de que el hilo principal libera el bloqueo, t1 obtiene el bloqueo y se ejecuta object.wait(), luego el estado de t1 es [ESPERANDO]. Luego regrese al hilo principal, obtenga el bloqueo y ejecute object.notify(). En este momento, el subproceso t1 se despierta y se encuentra en estado de ejecución [RUNNABLE]. La ejecución de t1 se completa y el estado es [TERMINADO].

El estado del parque de hilos ()

t1 park后的状态:WAITING
t1 unpark后的状态:WAITING

Puedes pensar por qué el hilo t1 está en este estado y escribiré un LockSupportartículo si tengo la oportunidad .

Recomendado en el pasado

Escanee el código QR para ser más emocionante. O busque Lvshen_9 en WeChat , puede responder para obtener información en segundo plano

1.回复"java" 获取java电子书;

2.回复"python"获取python电子书;

3.回复"算法"获取算法电子书;

4.回复"大数据"获取大数据电子书;

5.回复"spring"获取SpringBoot的学习视频。

6.回复"面试"获取一线大厂面试资料

7.回复"进阶之路"获取Java进阶之路的思维导图

8.回复"手册"获取阿里巴巴Java开发手册(嵩山终极版)

9.回复"总结"获取Java后端面试经验总结PDF版

10.回复"Redis"获取Redis命令手册,和Redis专项面试习题(PDF)

11.回复"并发导图"获取Java并发编程思维导图(xmind终极版)

Otro: haga clic en [ Mis beneficios ] para tener más sorpresas.

Supongo que te gusta

Origin blog.csdn.net/wujialv/article/details/108506393
Recomendado
Clasificación