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

绑架者

我正在学习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)

我很困惑,他们这样做都停止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>

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)
亚历克斯·卡辛

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

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

可运行的装置中的线程处于可运行状态的调用之后start()的方法。基本上:

t.start(); // t is Runnable

运行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

还有一个称为“定时等待”的状态,它几乎是同一件事,但是是由引起的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()方法退出时,已终止是处于终止或死状态的线程

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

线程生命周期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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章