Java线程的状态到底是什么意思?

kid*_*her 4 java performance android thread-dump thread-state

我正在Android Studio中学习该工具,获取线程转储,如下所示:

获取线程转储

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

在此处输入图片说明

我可以看到有runnablesleepingwaiting。我深入线程堆栈,大多数这样的线程堆栈,

"<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)
Run Code Online (Sandbox Code Playgroud)

我很困惑,他们这样做都停止Object.wait,但线程的状态可以是runnablesleepingwaiting

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

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>
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

Ale*_*hin 5

新建表示如果您创建Thread类的实例但在start()方法调用之前,线程处于新状态:

Thread t = new Thread(...); // t is New
Run Code Online (Sandbox Code Playgroud)

Runnable表示start()方法调用后线程处于可运行状态。基本上:

t.start(); // t is Runnable
Run Code Online (Sandbox Code Playgroud)

运行Runnable的“子状态” :如果线程调度程序选择了线程,则该线程处于运行状态。您无法对其进行任何明确的操作,这意味着您先打电话start()然后等待。

ReadyRunnable的另一个“子状态” :该线程可以运行,并等待线程调度程序选择它。

阻塞表示线程仍处于活动状态,但当前不符合运行条件。例如,当一个线程遇到一个synchronized块,而另一个线程处理该块时,就会发生这种情况。在这种情况下,第一个线程被阻塞

等待是线程既未阻塞也未就绪的状态。通常在调用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
Run Code Online (Sandbox Code Playgroud)

还有一个称为“ 定时等待”的状态,它几乎是同一件事,但是是由引起的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 Code Online (Sandbox Code Playgroud)

run()方法退出时,终止是处于终止或死状态的线程。

我想我涵盖了所有内容:)这是一张图片,可帮助您更清楚地理解它:

线程生命周期Java

根据JoxTraex的要求,以下是我在发布之前阅读的资源:

  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

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