2016-10-26 5 views
4

J'apprends l'outil dans Android Studio se décharge de fil, comme suit:Que signifie réellement l'état du thread java?

get thread dump

je remarque les différents états de chaque fil comme celui-ci,

enter image description here

Je peux voir il y a runnable, sleeping, waiting. Et je profondément dans la pile de fil, la plupart pile de fil comme celui-ci,

"<61> [email protected]" 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) 

Je suis confus qu'ils font tout arrêt à Object.wait, mais l'état de fil peut être runnable, sleeping, waiting?

Voici la pile de l'autre thread d'état.

RUNNABLE

<53> [email protected]" 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> [email protected]" 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) 
+1

S'il vous plaît utiliser 'au lieu d'images recueil HSC pour la trace de la pile. –

+0

Veuillez commencer à accepter les réponses. Je ne parle pas de cette question en particulier, je parle de toutes vos questions où vous avez de bonnes réponses, mais non acceptées. –

Répondre

4

Nouveau signifie que le fil est en état neuf si vous créez une instance de Thread classe mais avant l'appel de la méthode start():

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

Runnable signifie que le fil est en état inexécutable après invocation start() méthode. En gros:

t.start(); // t is Runnable 

L'exécution est le « sous-état » de Runnable: le fil est en état de fonctionnement si le programmateur de fil l'a sélectionné. Vous ne pouvez rien faire explicitement, c'est-à-dire que vous appelez start(), puis attendez.

Ready est une autre « sous-état » de Runnable: le fil est admissible à l'exécution et attend le planificateur de fil pour le sélectionner.

Bloqué Bloqué signifie que le thread est toujours en vie, mais qu'il n'est actuellement Cela se produit, par exemple, lorsqu'un thread rencontre un bloc synchronized, qui est traité par un autre thread.Dans ce cas, le premier thread devient bloqué.

En attente est l'état où votre fil est bloqué ni ni prêt. Cela se produit généralement lorsque vous appelez wait() ou join() sur un thread.

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 

Il y a aussi un état appelé chronométré attente, qui est à peu près la même chose, mais est causée en appelant sleep(). Si vous appelez wait(timeout) ou join(timeout), le fil obtient également chronométré en attente état.

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 est un fil en état terminé ou mort quand il est run() sort de la méthode.

Je pense que je couvrais tout :) Voici une image pour vous aider à comprendre plus clairement:

Thread Life Cycle Java

Comme JoxTraex demandé, sources here're J'ai lu avant de poster:

  1. javarush.ru
  2. http://www.uml-diagrams.org/examples/java-6-thread-state-machine-diagram-example.html
  3. http://www.journaldev.com/1044/thread-life-cycle-in-java-thread-states-in-java

Il est juste une question de bonne compétence googler, vraiment ...

+0

Pourriez-vous s'il vous plaît poster votre source et où vous avez mangé obtenir cette info? – JoxTraex

+1

@JoxTraex a mis à jour ma réponse –

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

Un état de fil. Un fil peut être dans un des états suivants:

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 fil peut être en un seul état à un moment donné dans le temps. Ces états sont des états de machine virtuelle qui ne reflètent aucun état de thread du système d'exploitation.

référez-vous à oracle's api pour plus d'informations.