Добрый день.
Есть вопрос для собеседования такой. Сколько способов создания нитей вы знаете. В ответах фигурирует цифра 2: либо создать

Thread
, передав ему Runnable
, либо создать объект класса-наследника Thread
, в котором переопределён run()
.
Но я задумался: а два ли?
Если использовать concurrent
, например, Executors.newFixedThreadPool(5)
, то когда будут созданы объекты потоков, сразу при выполнении этого метода, или позже, когда появятся задачи для исполнения (ведь они могут и не появиться). Все эти методы-фабрики возвращают какие-то конфигурации ThreadPoolExecutor
, у которого один из параметров конфигурации corePoolSize
Про это поле написано:
corePoolSize
– the number of threads to keep in the pool, even if they are idle, unless allowCoreThreadTimeOut
is set
С другой стороны, если задачи так и не поступили, то мы создали 5 workers в холостую, может они начинают создаваться, когда начинают поступать задачи?
В общем 2 или 3 варианта всё таки можно иметь в виду в качестве варианта ответа на вопрос?
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Я всегда считал, что концепция пула — это условно «создадим заранее и положим в одно место, чтобы потом от туда быстро брать», поэтому думал, что строркой
ExecutorService e = Executors.newFixedThreadPool(5)
мы заранее создаём пять объектов потоков. Полез в документацию, но перевёл не все нюансы, английский пока неидеален. Вот и спросил. Мне интересно знать, в какой момент создается объект потока: при исполнении строчки выше или при первом вызове execute/submit (а строка выше лишь указывает конфигурацию пула, но при этом не создает его).
Нет. Правильнее сказать, мы заранее настраиваем, что все в дальнейшем посылаемые в этот пул задачи будут параллельно исполняться максимум 5 одновременно.
Имея под рукой IDEA можно в режиме отладки просто узнать интересующую инфу на практике:
Попробуйте поэксперементируйте:
Или в разных точках, играя параметрами, например: