Что на самом деле означает состояние потока 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()
метод выхода.
Я думаю, что я охватил все это:) Вот изображение, чтобы помочь вам понять это более четко:
По просьбе JoxTraex, вот источники, которые я прочитал перед публикацией:
- https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.State.html
- javarush.ru
- http://www.uml-diagrams.org/examples/java-6-thread-state-machine-diagram-example.html
- 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 оракула для получения дополнительной информации.