¿Qué significa realmente el estado del hilo de Java?

Estoy aprendiendo la herramienta en Android Studio, obtener volcado de hilo, como sigue:

Conseguir volcado de hilo

Noto el estado diferente de cada hilo como este,

Introduzca aquí la descripción de la imagen

Puedo ver que hay runnable , sleeping , waiting . Y yo profundamente en la pila de hilos, la mayoría de la pila de hilos como este,

 "<61> RxComputationScheduler-3@830064517520" daemon prio=5 waiting java.lang.Thread.State: WAITING at java.lang.Object.wait(Object.java:-1) at java.lang.Thread.parkFor(Thread.java:1205) at sun.misc.Unsafe.park(Unsafe.java:325) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:157) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2017) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1050) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:778) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1035) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1097) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) at java.lang.Thread.run(Thread.java:841) 

Estoy confundido que hacen todo el alto en Object.wait , sin embargo el estado del hilo puede ser runnable , sleeping , waiting ?

Aquí está la pila del otro hilo de estado.

RUNNABLE

 <53> RxSchedulerPurge-1@830057651944" daemon prio=5 runnable java.lang.Thread.State: RUNNABLE at java.lang.Object.wait(Object.java:-1) at java.lang.Thread.parkFor(Thread.java:1205) at sun.misc.Unsafe.park(Unsafe.java:325) at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:197) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2056) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1062) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:778) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1035) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1097) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) at java.lang.Thread.run(Thread.java:841)</code> 

TIMED_WAITING

 <58> RxScheduledExecutorPool-2@830064740632" daemon prio=5 sleeping java.lang.Thread.State: TIMED_WAITING at java.lang.Object.wait(Object.java:-1) at java.lang.Thread.parkFor(Thread.java:1205) at sun.misc.Unsafe.park(Unsafe.java:325) at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:197) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2056) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1062) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:778) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1035) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1097) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) at java.lang.Thread.run(Thread.java:841) 

Nuevo significa que el subproceso está en estado nuevo si crea una instancia de clase Thread pero antes de la invocación del método start() :

 Thread t = new Thread(...); // t is New 

Runnable significa que el subproceso está en estado ejecutable después de la invocación del método start() . Básicamente:

 t.start(); // t is Runnable 

Ejecutar es el "sub-estado" de Runnable : el subproceso está en estado de ejecución si el programador de subprocesos lo ha seleccionado. Usted no puede hacer nada con él explícitamente, lo que significa que llamar a start() y luego esperar.

Listo es otro "sub-estado" de Runnable : el hilo es apto para ejecutarse y espera que el programador de hilos lo seleccione.

Bloqueado significa el estado cuando el hilo sigue vivo, pero actualmente no es apto para ejecutarse. Esto sucede, por ejemplo, cuando un hilo llega a través de un bloque synchronized , que es procesado por otro subproceso. En este caso, el primer hilo se bloquea .

Esperar es el estado cuando el hilo no está bloqueado ni listo . Esto suele suceder cuando llama a wait() o join() en un subproceso.

 Thread t1 = new Thread(); // t1 is New Thread t2 = new Thread(); // t2 is New t1.start(); // t1 becomes Runnable t2.start(); // t2 becomes Runnable t1.join(); // t2 becomes Waiting, because t1 is processed until it terminates 

También hay un estado llamado Timed Waiting , que es casi la misma cosa, pero es causado por llamar a sleep() . Si llama a wait(timeout) o join(timeout) , el thread también obtiene el estado de espera programada .

 Thread t = new Thread(); // t is New t.start(); // t is Runnable t.sleep(4000); // t get state of Timed Waiting for 4 seconds 

Terminated es un subproceso en el estado terminado o muerto cuando se run() sale del método.

Creo que lo cubrió todo 🙂 Aquí está una imagen para ayudarle a entenderlo más claramente:

Ciclo de vida del hilo de rosca Java

Como solicitó JoxTraex, he aquí fuentes que leí antes de publicar:

  1. https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.State.html
  2. Javarush.ru
  3. http://www.uml-diagrams.org/examples/java-6-thread-state-machine-diagram-example.html
  4. http://www.journaldev.com/1044/thread-life-cycle-in-java-thread-states-in-java

Es sólo una cuestión de buena habilidad de google, en realidad …

 public static enum Thread.State extends Enum<Thread.State> 

Un estado de subproceso. Un subproceso puede estar en uno de los siguientes estados:

 NEW A thread that has not yet started is in this state. RUNNABLE A thread executing in the Java virtual machine is in this state. BLOCKED A thread that is blocked waiting for a monitor lock is in this state. WAITING A thread that is waiting indefinitely for another thread to perform a particular action is in this state. TIMED_WAITING A thread that is waiting for another thread to perform an action for up to a specified waiting time is in this state. TERMINATED A thread that has exited is in this state. 

Un hilo puede estar en un solo estado en un momento dado. Estos estados son estados de máquina virtual que no reflejan ningún estado de subproceso del sistema operativo.

Consulte el api de oracle para obtener más información.

  • Cómo convertir mi proyecto de Android en un proyecto de maven
  • Efecto de trayectoria de trazo que hace la pantalla lenta
  • ¿Cómo ahorrar una matriz larga como números hexadecimales inversos más rápido?
  • Rendimiento de bucle ArrayList en ART (Android Runtime Environment)
  • Android diccionario TreeSet tiempo de carga más rápido
  • Cómo iniciar / iniciar el android estilo de actividad más rápido
  • ¿Cómo configurar el desplazamiento perfomance para webview?
  • Procesamiento lento de lotes de modelos en libGDX
  • Forma preferida de actualizar sqlite db en android
  • Rendimiento ORM: ¿es greenDAO más rápido que ORMLite?
  • Map.clear () vs nuevo Mapa: ¿Cuál será mejor?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.