Я думаю, что я понял, что confuzzabling ты так вот мой развернутый ответ: терминология крошечное немного вводит в заблуждение (очевидно, иначе вы бы не задать этот вопрос конкретно поставить акцент на «повторного использования»):
Как использовать потоки пулов для повторного использования?
То, что происходит в том, что один поток может быть использован для обработки нескольких задач (как правило, передаются в Runnable
, но это зависит от вашей структуры «исполнитель»: исполнители по умолчанию принимает Runnable
, но вы можете написать свой собственный «исполнитель "/ thread-pool принимает что-то более сложное, чем Runnable
[как, скажем, CancellableRunnable
]).
Теперь в реализации по умолчанию ExecutorService
, если поток каким-то образом завершен во время использования, он автоматически заменяется новым потоком, но это не «повторное использование», о котором они говорят. В этом случае «повторного использования» нет.
Так это правда, что вы не можете назвать start()
на Java тему дважды но вы можете пройти столько Runnable
, как вы хотите исполнителя и каждый run()
метод Runnable
«s созываются один раз.
Вы можете передать 30 Runnable
на 5 Java Thread
и каждый рабочий поток может быть вызовом, например, run()
6 раз (практически там не гарантирует, что вы будете выполнения ровно 6 Runnable
за Thread
но это детали).
В этом примере start()
было бы названо 6 раз. Каждый из них 6 start()
будут называть ровно один разrun()
метода каждого Thread
:
От Thread.start()
Javadoc:
* Causes this thread to begin execution; the Java Virtual Machine
* calls the <code>run</code> method of this thread.
НО затем внутри run()
метода каждого потока Runnable
должны быть удалены из очереди и будет вызываться метод run()
каждого из Runnable
. Поэтому каждый поток может обрабатывать несколько Runnable
. Это то, что они называют «повторным использованием потока».
Один из способов сделать свой собственный пул потоков, чтобы использовать очередь блокировки, на которую вы епдиеее runnables и имеете каждый из вашего потока после того, как это делается обработкой run()
метода Runnable
, Dequeue следующего Runnable
(или блока) и запустите его метод run()
, затем промойте и повторите.
Я думаю, часть путаницы (и это немного сбивает с толку) исходит из того, что Thread
принимает Runnable
и при вызове start()
run()
метод Runnable «s называется в то время как резьба по умолчанию бассейны в также взять Runnable
,
tl; dr Потоки пула потоков - это в основном запущенные петли, которые вытягивают заданные задачи из очереди.Нити не прекращают выполнение, когда они обслуживают задачу, они просто ждут следующего, который будет отправлен в очередь. Они никогда не получают «повторение», как задавали в вопросе, поскольку они просто постоянно работают. – Sogger