Какая польза от пула потоков в Java? - PullRequest
33 голосов
/ 20 июля 2010

Какая польза от пула потоков?Есть ли хороший пример из реального мира?

Ответы [ 6 ]

43 голосов
/ 20 июля 2010

Пул потоков - это группа изначально созданных потоков, которая ожидает задания и выполняет их. Идея состоит в том, чтобы потоки всегда существовали, чтобы нам не приходилось тратить время на их создание каждый раз. Они уместны, когда мы знаем, что есть поток заданий для обработки, хотя может быть некоторое время, когда нет заданий.

Вот хорошая диаграмма из Википедии : alt text

7 голосов
/ 20 июля 2010

Thread Pools из Java Tutorials имеет хороший обзор:

Использование рабочих потоков минимизирует накладные расходы из-за создания потока. Объекты потока используют значительный объем памяти, и в крупномасштабном приложении выделение и освобождение многих объектов потока создает значительные накладные расходы на управление памятью.

5 голосов
/ 15 января 2015

Пулы потоков полезны только в ситуациях типа «сервер-клиент», когда число / вхождение клиентских запросов невозможно определить / предсказать.

В этом сценарии создание нового потока каждый раз, когда клиентский запрос выполняетсяmade имеет два недостатка:

1) Задержка времени выполнения для создания потока: создание потока требует некоторого времени, поэтому фактическое задание не запускается, как только поступает запрос. Клиент может заметитьнебольшая задержка.

Этот критерий имеет решающее значение в интерактивных системах, где клиент ожидает немедленных действий.

2) Неконтролируемое использование системных ресурсов: потоки потребляют системные ресурсы (память и т. д.), таким образомсистема может исчерпать ресурсы в случае беспрецедентного потока клиентских запросов.

Пулы потоков решают вышеуказанные проблемы следующим образом:
1) Создание указанного числа потоков при запуске сервера вместо созданияих во время выполнения.
2) Ограничение количества потоков, работающих на любомзаданное время.

Примечание. Вышеуказанное применимо к пулам потоков фиксированных размеров.

5 голосов
/ 20 июля 2010

Простой Google поиск даст много информации о пулах потоков Java и пулах потоков в целом.

Вот несколько полезных ссылок:

4 голосов
/ 20 июля 2010

Вы можете предположить, что потоки являются фактическими работниками, а потоки потоков - группой работников. Вы можете создать несколько групп по разным причинам, таким как приоритет, цель и т. Д. Таким образом, хотя один пул может использоваться для задач общего назначения, таких как фоновые расписания, широковещательная рассылка электронной почты и т. Д., Может существовать пул обработки транзакций для одновременной обработки нескольких транзакций. В случае Службы Исполнителя, я уверен, что вы не хотели бы откладывать выполнение транзакционных заданий после того, как другие некритические действия, такие как рассылка подтверждающих писем или обслуживание базы данных, не завершены. Вы можете разделить их на пулы и поддерживать их самостоятельно. Это очень упрощенный ответ без технических терминов. С Уважением, KT

3 голосов
/ 11 июля 2017

Пул потоков - это пул уже созданного рабочего потока, готового выполнить задание. Он создает Thread и управляет ими. Вместо того чтобы создавать поток и отбрасывать его после выполнения задачи, пул потоков повторно использует потоки в форме рабочего потока.

Почему?

Поскольку создание Thread занимает много времени и задерживает обработку запроса. Он также ограничивает количество клиентов в зависимости от того, сколько потоков на JVM разрешено, что, очевидно, является ограниченным числом.


Создание пула потоков фиксированного размера с использованием среды Executor -

Java 5 представила полнофункциональный встроенный фреймворк Thread Pool, широко известный как Executor framework .

Создание пула потоков фиксированного размера с использованием инфраструктуры Java 5 Executor довольно легко из-за статических фабричных методов, предоставляемых классом Executors. Все, что вам нужно сделать, это определить свою задачу, которую вы хотите выполнить одновременно, и затем отправить эту задачу в ExecutorService.

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

public class ThreadPoolExample {
    public static void main(String args[]) {
       ExecutorService service = Executors.newFixedThreadPool(10); //create 10 worker threads in Thread Pool
       for (int i =0; i<100; i++){
           service.submit(new Task(i)); //submit that to be done 
       }
    }  
}

final class Task implements Runnable {
    private int taskId;  
    public Task(int id){
        this.taskId = id;
    }

    @Override
    public void run() {
        System.out.println("Task ID : " + this.taskId +" performed by " 
                           + Thread.currentThread().getName());
    }  
}

Output:
Task ID : 0 performed by pool-1-thread-1
Task ID : 3 performed by pool-1-thread-4
Task ID : 2 performed by pool-1-thread-3
Task ID : 1 performed by pool-1-thread-2
Task ID : 5 performed by pool-1-thread-6
Task ID : 4 performed by pool-1-thread-5

*Output may vary from system to system
...