Анализ трассировки стека Java, какие потоки работают - PullRequest
1 голос
/ 05 апреля 2011

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

В своей трассировке стека я вижу следующие состояния

java.lang.Thread.State: WAITING (on object monitor)
java.lang.Thread.State: RUNNABLE
java.lang.Thread.State: TIMED_WAITING (sleeping)
java.lang.Thread.State: WAITING (parking)
java.lang.Thread.State: TIMED_WAITING (parking)

Во-первых, что именно означают эти состояния?

Во-вторых, у меня есть 11 потоков runnable, два из которых ожидают выполнения условия.Означает ли это, что 9 потоков работают одновременно?Это кажется невозможным, поскольку на моей машине нет такого количества ядер.

Ответы [ 2 ]

6 голосов
/ 05 апреля 2011

Термин Runnable может не означать «работает в данный момент», а «находится в состоянии работы». Различия, к которым вы обращались, заключаются в том, что максимальное количество потоков, которые могут работать в любой момент времени, равно количеству ядер

Чтобы понять это более подробно, вам нужно знать, что означают другие два. WAITING будет означать, что поток приостановлен на некотором объекте.

while(<condition holds>)
    obj.wait()

Здесь текущий поток WAITING на мониторе obj. Это приведет к приостановке этого потока, в котором ОС может запланировать запуск другого потока.

TIMED_WAITING просто приостанавливает поток на определенное время.

То есть, если поток не wait не используется или sleep не используется, он считается run ning

Чтобы получить больше информации из документации.

Состояние потока для работающего потока. поток в работоспособном состоянии выполнение в виртуальной машине Java но может ждать других ресурсы из операционной системы такой как процессор.

Последняя часть - это то, что, я думаю, вы ищете. Физически ОС не может запускать больше потоков параллельно, чем количество ядер.
Все 9 ваших потоков могут работать одновременно, но только n будет работать параллельно (n - количество ядер).

То же самое верно для Condition.await

Edit:

Извините, богатые люди - Мне следовало связать мой ресурс http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Thread.State.html#RUNNABLE

0 голосов
/ 05 апреля 2011

Посмотрите, поможет ли вам эта страница http://download.oracle.com/javase/6/docs/api/java/lang/Thread.State.html

Чтобы ответить на ваш второй вопрос о количестве ядер против потоков.На ядре может быть запущено несколько потоков одновременно.Поэтому # threads> = # cores

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

...