2016-10-26 88 views
4

我学习Android Studio中的工具,获得线程转储,如下:java线程的状态究竟意味着什么?

get thread dump

我注意到这样每个线程的不同状态,

enter image description here

我可以看到有runnable,sleeping,waiting。我深入到线程堆栈,这样最线程的堆栈,

"<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) 

我很困惑,他们尽一切停止在Object.wait,但是线程的状态可以是runnablesleepingwaiting

这是另一个状态线程的堆栈。

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

请使用'code'而不是堆栈跟踪图像。 –

+0

请开始接受答案。我并没有特别谈论这个问题,我在谈论你所有的问题,你有很好但不被接受的答案。 –

回答

4

意味着线程处于新的状态,如果你创建Thread类的实例,但start()方法的调用之前:

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

Runnable接口意味着线程处于可运行状态的调用之后start()方法。基本上是:

t.start(); // t is Runnable 

运行是“亚状态”的Runnable的:线程是如果线程调度器已经选择了它的运行状态。你不能明确地做任何事情,这意味着你打电话start(),然后等待。

准备是另一种“亚状态”的Runnable的:线程可享有运行并等待线程调度器来选择它。

被阻止表示线程仍处于活动状态但目前没有资格运行的状态。例如,当一个线程遇到由另一个线程处理的​​块时,会发生这种情况。在这种情况下,第一个线程变成被阻止

等待是国家当你的线程既不是堵塞也不准备。当您在线程上调用wait()join()时,通常会发生这种情况。

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 

还有一个状态称为定时等待,这几乎是同样的事情,但通过调用sleep()引起的。如果您拨打wait(timeout)join(timeout),线程也会获得定时等待状态。

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

终止在终止或死亡状态的线程时,它的run()方法退出。

我想我涵盖了一切:)这里是一个图像,以帮助您了解得更清楚:

Thread Life Cycle Java

由于JoxTraex要求,我这里还有我的来源,然后再发布阅读:

  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

这只是一个良好的谷歌搜索技巧的事情,真的...

+0

您能否发布您的信息来源以及您从哪里获取此信息? – JoxTraex

+1

@JoxTraex更新了我的答案 –

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

线程状态。线程可处于以下状态之一:

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. 

线程在给定时间点只能处于一个状态。这些状态是不反映任何操作系统线程状态的虚拟机状态。

请参阅oracle's api了解更多信息。

相关问题