2016-10-26 6 views
4

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

get thread dump

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

enter image description here

Я могу видеть есть runnable, sleeping, waiting. И я глубоко в стеке потока, большинство стека потока, как это,

"<61> [email protected]" 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> [email protected]" 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> [email protected]" 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) 
+1

Пожалуйста, используйте 'code' вместо изображений для трассировки стека. –

+0

Пожалуйста, начните принимать ответы. Я не говорю об этом в частности, я говорю обо всех ваших вопросах, где у вас есть хорошие, но неприемлемые ответы. –

ответ

4

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

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

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

t.start(); // t is Runnable 

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

Ready еще один «суб-состояние» 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 ожидания, что почти то же самое, но вызвано вызовом 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() метод выхода.

Я думаю, что я покрыл все это :) Вот изображение, чтобы помочь вам понять это более ясно:

Thread Life Cycle Java

По просьбе JoxTraex, here're источники я прочитал перед проводкой:

  1. javarush.ru
  2. http://www.uml-diagrams.org/examples/java-6-thread-state-machine-diagram-example.html
  3. http://www.journaldev.com/1044/thread-life-cycle-in-java-thread-states-in-java

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

+0

Не могли бы вы разместить свой источник и где вы ели получать эту информацию? – JoxTraex

+1

@JoxTraex обновил мой ответ –

1
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. 

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

см. oracle's api для получения дополнительной информации.

Смежные вопросы