Что на самом деле означает состояние потока Java?

Я изучаю инструмент в Android Studio, получаю дамп потока следующим образом:

получить дамп потока

Я замечаю различное состояние каждого потока, как это,

введите описание изображения здесь

Я вижу, что есть 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,waiting?

Вот стек другого состояния потока.

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)

2 ответа

Решение

Новый означает, что поток находится в новом состоянии, если вы создаете экземпляр Thread класс, но до вызова start() метод:

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

Runnable означает, что поток находится в состоянии выполнения после вызова start() метод. В принципе:

t.start(); // t is Runnable

Выполнение - это " подсостояние " Runnable: поток находится в состоянии выполнения, если планировщик потока выбрал его. Вы ничего не можете сделать с этим явно, то есть вы звоните start() а потом просто подожди.

Готово - это еще одно " подсостояние " Runnable: поток имеет право на запуск и ожидает, когда планировщик потока выберет его.

Заблокированный означает состояние, когда поток еще жив, но в настоящее время не имеет права на запуск. Это происходит, например, когда один поток сталкивается с 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

Существует также состояние под названием 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

Прекращенный - поток в завершенном или мертвом состоянии, когда он 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

Это просто вопрос хорошего гугл-мастерства, правда...

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.

Поток может находиться только в одном состоянии в данный момент времени. Эти состояния являются состояниями виртуальных машин, которые не отражают состояния потоков операционной системы.

обратитесь к API оракула для получения дополнительной информации.

Другие вопросы по тегам