Каково использование пула потоков в Java?

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

Ответ 1

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

Здесь хорошая диаграмма из Wikipedia: alt text

Ответ 2

Пулы потоков из учебников Java имеет хороший обзор:

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

Ответ 3

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

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

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

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

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

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

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

Ответ 4

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

Ответ 6

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

Почему?

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


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

Java 5 представила полнофункциональную встроенную структуру пула потоков, широко известную как инфраструктура Executor.

Создание пула потоков фиксированного размера с использованием инфраструктуры Java 5 Executor довольно просто из-за статических методов factory, предоставляемых классом 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