Когда вы выполните ExecutorService e=Executors.newFixedThreadPool(3);
, пул потоков будет создан с тремя потоками внутри него. И эти 3 потока будут использованы для выполнения любой задачи, выполненной на вас e
.
При попытке выполнить задачи через ExecutorService
он будет добавлен в очередь задач, если количество потоков в пуле больше числа заданий, то, как только придет какая-то задача, некоторый свободный поток в пуле будут выбраны и использованы для выполнения задачи.
Когда количество задач становится больше, чем количество потоков в пуле, то они будут добавлены в pipleline в очереди, и как только какой-то поток будет завершен, этот поток будет использоваться для выполнения задачи из очереди очереди ,
пулы Тема:
Нить, который только что закончил не закончится. Просьба отметить, что это пул потоков, поэтому потоки объединяются, что означает, что они не будут завершены (как правило, до тех пор, пока у вас не будет некоторый тайм-аут или какой-либо другой механизм), но вернутся в пул, чтобы их можно было повторно использовать. И именно по этой причине ваши 4 и 5-го запуска будут выполняться через эти объединенные потоки.
"новая тема не будет создана, но работа будет ждать нить , чтобы быть бесплатной".
Это так же, как описано выше, что тогда они положили ждать в очереди, и как только некоторые нити делается с выполнением задач, ожидая задания из очереди будут объединены и быть выполнены из свободной нити , и это произойдет до тех пор, пока все задачи из очереди не будут очищены.
Ничего нового потока не будет создано, потому что вы использовали newFixedThreadPool
, поэтому создан фиксированный пул потоков из 3 потоков, и они будут использоваться только для обработки всех запрошенных задач, поступающих в этот конкретный экземпляр ExecutorService
, и в вашем случае это есть e
.
Другие варианты резьбы бассейновой:
Вы можете создать пул потоков несколькими способами, используя java.util.concurrent.Executors
. Например, используя Executors#newCachedThreadPool()
, вы можете создать пул потоков, который при необходимости создает новые потоки, но будет использовать ранее созданные потоки, когда они будут доступны.
Проверьте все доступные способы найти наиболее подходящий вариант.
+ 1'ed .. В чем преимущество такого подхода при использовании 'ExecutorService', который, если я прав, функционально одинаковый? – hagrawal
@hagrawal, мой пример - это не подход к чему-либо, кроме обучения. Он предназначен только для иллюстрации того, кто может не понимать, что делает пул потоков. Я бы не использовал его как есть в любом реальном приложении, потому что ему не хватает многих полезных функций (обработка исключений, механизм выключения, фьючерсы и т. Д.), И не стоит тратить время на его улучшение, потому что классы в java. util.concurrent уже делает все, что мне обычно нужно. –
любая подсказка/идея о том, как будет работать shutdown для этого? – krs8888