¿Qué significa realmente el estado del hilo de Java?
Estoy aprendiendo la herramienta en Android Studio, obtener volcado de hilo, como sigue:
- Desplazamiento a través de ListView con algunas imágenes muy laggy
- ¿Qué es EGL y GL mtrack en Android Memory Dump
- HTTP Vs sockets Vanilla para cargar archivos binarios grandes (50-200 MB) desde un dispositivo Android a través de una red Wi-Fi de un solo salto
- Responde al teclado mientras se actualiza la interfaz de usuario
- Mover instancias de Set a otro en Scala
Noto el estado diferente de cada hilo como este,
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)
- ¿Por qué ViewPager y GridLayout con 30 elementos son muy lentos?
- Posible BUG en Android Clase ImageDownloader: sHardBitmapCache NO estática cuando debería ser?
- Android Studio es más rápido en una PC con Linux?
- ¿Cuáles son las ventajas / desventajas de pasar argumentos al constructor AsyncTask?
- Problema de bajo rendimiento de Phonegap
- Variables estáticas, patrón y rendimiento de Android
- Costo de invocar un método en Android
- ¿Qué es "pools de asignación para objetos temporales"?
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:
Como solicitó JoxTraex, he aquí fuentes que leí antes de publicar:
- https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.State.html
- Javarush.ru
- http://www.uml-diagrams.org/examples/java-6-thread-state-machine-diagram-example.html
- 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.