Как пул кэшированных потоков повторно использует существующие потоки
Я только начал изучать класс Java Executors
и метод newCachedThreadPool( )
. Согласно API, результирующий пул потоков повторно использует существующие объекты Thread
для новых задач.
Я немного озадачен тем, как это реализовано, потому что я не смог найти какой-либо метод в API Thread
, который позволяет вам установить поведение существующего объекта Thread
.
Например, вы можете создать новый Thread
из объекта Runnable
, что делает вызов Thread
методом Runnable
run( )
. Однако в API Thread
нет метода setter, который принимает Runnable
в качестве аргумента.
Буду признателен за любые указатели.
Ответы
Ответ 1
Исполнители делают все для вас в фоновом режиме. И да, он использует только существующий API потоков.
Ниже ссылка имеет пример реализации пула потоков, реализованного с использованием класса Thread и API Collection: http://www.ibm.com/developerworks/library/j-jtp0730/index.html
Ответ 2
В принципе представьте, что каждый поток из пула делает это:
public void run() {
while(true) {
if(tasks available) {
Runnable task = taskqueue.dequeue();
task.run();
} else {
// wait or whatever
}
}
}
Ответ 3
В threadpool есть потоки, которые ищут выполняемые задания. Вместо запуска нового потока из Runnable
поток будет просто вызывать функцию run()
. Таким образом, поток в ThreadPool
не создается с помощью Runnable
, который вы предоставляете, но с тем, который просто проверяет, готовы ли какие-либо задачи к выполнению и вызывает их напрямую.
Итак, это выглядит примерно так:
while(needsToKeepRunning()){
if(hasMoreTasks()){
getFirstTask().run();.
}
else
{
waitForOtherTasks();
}
}
Конечно, это слишком упрощено, реальная реализация с ожиданием намного элегантнее. Большой источник информации о том, как это действительно работает, можно найти в Concurrency на практике
Ответ 4
Нити создаются только один раз в API пула потоков (за исключением случаев, когда из-за какого-то исключения поток выходит из строя)
Рабочие потоки опросят Очередь, чтобы увидеть, есть ли задача и использовать ее. Поэтому нити никогда не выходят.
Это просто абстракция, что Threads повторно используются (абстракция для них никогда не останавливается). Очевидно, что они останавливаются после простоя ожидания и завершения работы.
Runnable ----- > Пулы потоков (Некоторые рабочие потоки потребляют Runnable, а другие ждут еще несколько Runnables)
Ответ 5
Ну, поток только должен вызывать Runnable.run()
для исполняемых файлов, которые ему назначены...
Ответ 6
Упрощенное объяснение заключается в том, что при передаче Runnable в ExecutorService Runnable помещается в очередь. Рабочие потоки ThreadPool читаются из этой очереди и вызывают метод runnables run() в очереди.