Подтвердить что ты не робот

Как пул кэшированных потоков повторно использует существующие потоки

Я только начал изучать класс Java Executors и метод newCachedThreadPool( ). Согласно API, результирующий пул потоков повторно использует существующие объекты Thread для новых задач.

Я немного озадачен тем, как это реализовано, потому что я не смог найти какой-либо метод в API Thread, который позволяет вам установить поведение существующего объекта Thread.

Например, вы можете создать новый Thread из объекта Runnable, что делает вызов Thread методом Runnable run( ). Однако в API Thread нет метода setter, который принимает Runnable в качестве аргумента.

Буду признателен за любые указатели.

4b9b3361

Ответ 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() в очереди.