java - java线程的状态到底意味着什么?

标签 java android performance thread-dump thread-state

我正在学习Android Studio中的工具,获取thread dump,如下:

get thread dump

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

enter image description here

我可以看到有runnable,sleeping,waiting。而我深入线程栈,大多数线程栈都是这样的,

"<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 处停止,但是线程的状态可以是 runnable,sleeping,等待?

这是其他状态线程的堆栈。

可运行

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

最佳答案

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

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

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

t.start(); // t is Runnable

RunningRunnable的“子状态”:如果线程调度器选择了它,线程就处于运行状态。你不能明确地对它做任何事情,这意味着你调用 start() 然后等待。

ReadyRunnable的另一个“子状态”:线程符合运行条件,等待线程调度器选择它。

Blocked 表示线程还活着,但目前没有资格运行时的状态。例如,当一个线程遇到由另一个线程处理的 synchronized block 时,就会发生这种情况。在这种情况下,第一个线程变得阻塞

等待 是您的线程既未阻塞 也未就绪 的状态。当您在线程上调用 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

还有一种状态叫做Timed Waiting,这几乎是一回事,只不过是调用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

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

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

Thread Life Cycle 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

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

关于java - java线程的状态到底意味着什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40253040/

相关文章:

java:由于错误元素 java.util.ArrayList 中存在问题,没有为 ProductMapper 创建实现

java - 扩展后ThreadPoolExecutor的使用

java - gwt 中的 URL 映射

android - 在android中将多个图像添加到水平 ScrollView

android - __android_log_print 相当于 printf

c# - 给定数字列表中子系列的数量

java - 显示带有 Jersey 的 html 表单发布信息

java - DatePickerDialog 留下空白 android

通过位移位快速乘法提高性能

c++ - while(1) 对比。 for (;;) 有速度差异吗?