Что в параллелизме Java делает поток «активным»? Только то, что он не работает на холостом ходу? Является ли «ожидающий» или «приостановленный» поток технически активным?
Что определяет активный поток?
- В каком контексте появляется слово active? Это слишком общий термин, чтобы дать точное определение при таком небольшом количестве информации. 28.04.2012
- Обычно допустимо иметь от 4 до 20 активных потоков на ядро. 28.04.2012
- Активный поток
java
— это поток, который имеет право быть текущим исполняемым потоком. Это поток, который вышел из нового состояния и достиг (или повторно достиг) рабочего состояния. Активные потоки размещаются в пуле исполняемых потоков. Распространенной ошибкой является использование контекстно-зависимого термина active в качестве исполняемого потока, который выполняется в данный момент. 12.02.2014
Ответы:
Из того, что я могу сказать, термин «активный», кажется, используется много, но никогда не определяется. Метод ThreadGroup.enumerate()
задокументирован для:
Копирует в указанный массив каждый активный поток в этой группе потоков и ее подгруппах.
и из исходника для этого, он проверяет Thread.isAlive()
a> и добавляя их к перечислимому. Из этого я делаю вывод, что термины «активный» и «живой» взаимозаменяемы, а «живой» определяется как:
Поток жив, если он был запущен и еще не умер.
Взгляните на java.lang.Thread.State
В других системах, отличных от Java, active означает «RUNNABLE». Задача/процесс/поток активны, если они могут активно выполнять код. Он приостанавливается, если он не (блокировка и т.
Как сказал Стивен С, здесь active используется скорее как английский, чем как Java.
В этом контексте я понимаю, что «активный» означает, что они выполняют код. Неактивные потоки — те, которые заблокированы при вызовах ввода-вывода или ожидают блокировки — потребляют только ресурсы памяти, не затрагивая ЦП (или лишь незначительно).
Однако это действительно зависит от того, что делают ваши потоки. Если каждый поток перебирает числа для вычисления простых чисел, они полностью привязаны к процессору, и вам действительно нужно иметь только один поток на ядро, чтобы максимизировать пропускную способность. Если они выполняют HTTP-запросы или выполняют файловый ввод-вывод, вы можете позволить себе иметь довольно много на ядро.
В конце концов, общее заявление, охватывающее все потоки в целом, без учета того, что они делают, довольно бесполезно.
Я настоятельно рекомендую книгу Java Concurrency in Practice для качественная трактовка темы параллельного программирования на Java.
Слово «активный» используется здесь в обычном английском смысле.
Обычное английское значение слова active — «делать что-то». Таким образом, интуитивное значение «активного» для потоков состоит в том, что они фактически выполняются или готовы к выполнению.
В контексте этой цитаты:
"Обычно допустимо иметь от 4 до 20 активных потоков на ядро"
слово «активный» используется последовательно с этим, хотя я бы поспорил с цифрами. (20 слишком много, ИМО).
Однако я бы сказал, что это намеренно расплывчатое утверждение. Раздачами являются использование ласковой фразы «это общепринято» (вместо ссылки на какие-либо конкретные источники) и широкий диапазон («4–20»). Таким образом, вы можете сделать вывод, что слово «активный» является еще одним примером преднамеренной расплывчатости.
ИМО, автор цитаты пытается сделать общий вывод о том, что «слишком много потоков — это плохо» ... не уточняя, что такое «слишком много». Извлекать более точные указания, связывая то, что он подразумевает под «активным», бессмысленно. (И чтобы было ясно, невозможно сказать, сколько "слишком много"... вообще.)
«Обычно допустимо иметь от 4 до 20 активных потоков на ядро». — Адам Тэннон
В этом смысле я думаю, что это слово означает «готовый к запуску», а не «живой» или любой другой из возможных значений. Имеет смысл иметь не более нескольких потоков в очереди готовности, потому что вы не получаете никакой ценности для ожидающих потоков, и вы вносите свой вклад в накладные расходы планирования и переключения контекста. С другой стороны, если у вас меньше готовых к запуску потоков, чем ядер, вы не используете доступный ресурс.