Неактивный ли поток занимает время выполнения CPU в Java Executors?

Когда у меня есть этот код в приложении:

Executors.newFixedThreadPool(4);

но я никогда не использую этот пул потоков. Будут ли незанятые потоки потреблять процессорное время? Если так - почему?

2 ответа

Нет, эти темы создаются лениво, или "по требованию". Как указано в документации (выделено мое):

Строительство по требованию

По умолчанию даже основные потоки изначально создаются и запускаются только при поступлении новых задач.

Java предоставляет методы для переопределения этого значения по умолчанию и позволяет легко создавать, а именно prestartCoreThread а также prestartAllCoreThreads,


После того, как потоки действительно созданы, свободные (как правило) не будут занимать процессорное время, так как нет никаких причин для их планирования в ядре, когда у них нет работы.

Тем не менее, они по-прежнему сохраняют некоторую память для своего стека и еще много чего.

Javadoc утверждает:

Создает пул потоков, который повторно использует фиксированное число потоков, работающих в общей неограниченной очереди. В любой момент не более nThreads потоков будут активными задачами обработки.

Это может привести к предположению: мы не знаем точно. Но, как ясно находит другой ответ - мы можем знать, и реализация на самом деле полностью ленива. Таким образом:

 ExecutorService service = Executors.newFixedThreadPool(4);

даже не вызывает много настроек. Реализация будет свободна ждать любого

 service.submit(...

произойдет.

С другой стороны, этот пул потоков (теоретически) может быть создан немедленно, а также могут быть созданы 4 потока ОС. В последнем случае все эти потоки будут простаивать, поэтому они не должны потреблять ресурсы процессора.

Но, конечно, как правильно указывает Эллиотт, этот начальный шаг создания пула и (потенциально) создания 1-4 потоков требует активности процессора.

И конечно:потоки- это ресурс ОС. Так что даже когда они "только существуют" и ничего не делают; у них есть эта "стоимость". И опять же, это может зависеть от операционной системы, если это когда-нибудь может стать проблемой (например, достижение некоторого ограничения на "максимальное количество существующих потоков").

Наконец: поскольку это заинтересовало меня, я взглянул на текущий исходный код Java8 ( из newFixedThreadPoo() и ThreadPoolExcecutor() в DefaultThreadFactory). Если я не ошибаюсь: эти конструкторы только готовятся к созданию потока.

Итак: "текущая" реализация "полностью" ленива; и если вы действительно только позвоните newFixedThreadPool() без использования полученного ExecutorService ... ничего не происходит (с точки зрения создания новых потоков).

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