2017-02-08 7 views
1

Если у меня есть пул потоков фиксированного размера, когда он действительно вызовет Thread.start() для запуска потоков? (Будет ли запускать их, когда он получает создан или это будет ждать, пока я не начну подавших задачи?)Создание фактического потока в пуле потоков

+0

Ваш вопрос не очень ясен для меня. – Sid

+0

Возможный дубликат [Как Threadpool повторно использует потоки и как это работает] (http://stackoverflow.com/questions/19765904/how-threadpool-re-use-threads-and-how-it-works) – Calculator

ответ

1

Если вы создаете размер пула потоков фиксированной так:

ExecutorService es = Executors.newFixedThreadPool(5); 

Нет нитей изначально не созданы. Когда вы отправляете первую задачу, создается только 1 поток (он называется «пул-1-нить-1».

Для каждой дополнительной заданной задачи создается новый поток до указанного фиксированного размера (5 . в данном примере), даже если задачи не на самом деле работает параллельно

Если, например, вы только представить 3 задачи, только три темы будут созданы со следующими именами: pool-1-thread-1 pool-1-thread-2 pool-1-thread-3

Эта оптимизация важно, так как создание новой нити является ресурсоемкой операцией.

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

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

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

Эта информация верна для JDK 7. Я не проверял другие реализации.

+0

Я думаю этот ответ выиграет от некоторых ссылок или вспомогательных деталей. (Является ли это поведение указанным где-то? Это верно во всех реализациях JDK?) – ruakh

+0

@Gray: Я не понимаю ваш комментарий. Вы говорите, что посмотрели исходный код конкретной реализации JDK и подтвердили, что объяснение кодера vstrom точно описывает поведение этой реализации? Если да, то рассмотрите возможность редактирования ответа, чтобы указать конкретную реализацию JDK, которую вы подтвердили, что она правильна (и со ссылками на соответствующий код). – ruakh

+0

Да, у меня есть @руах. Например, любой комплект для разработки солнца имеет src.zip. Источники openjdk могут быть получены отсюда: http://download.java.net/openjdk/jdk8/ К сожалению, ни один из этих кодов не связан ссылками. – Gray