Что такое пул потоков? Есть ли хороший пример в реальном мире?
Каково использование пула потоков в Java?
Ответ 1
Пул потоков - это группа изначально созданных потоков, которая ждет заданий и выполняет их. Идея состоит в том, чтобы всегда существовать потоки, чтобы нам не приходилось оплачивать накладные расходы для их создания каждый раз. Они подходят, когда мы знаем, что поток рабочих процессов обрабатывается, хотя может быть какое-то время, когда нет заданий.
Здесь хорошая диаграмма из Wikipedia:
Ответ 2
Пулы потоков из учебников Java имеет хороший обзор:
Использование рабочих потоков минимизирует накладные расходы из-за создания потоков. Объекты Thread используют значительный объем памяти, а в крупномасштабном приложении выделение и освобождение многих объектов потоков создает значительную служебную нагрузку на управление памятью.
Ответ 3
Пулы потоков полезны только в ситуации типа Server-client, где число/возникновение клиентских запросов не может быть определено/предсказано.
В этом случае создание нового потока каждый раз, когда выполняется запрос клиента, имеет два недостатка:
1) Задержка времени выполнения для создания потока: Создание потока требует некоторого времени, поэтому фактическое задание не начинается, как только приходит запрос. Клиент может заметить небольшую задержку.
Этот критерий имеет решающее значение в интерактивных системах, где клиент ожидает немедленных действий.
2) Неконтролируемое использование системных ресурсов: Темы потребляют системные ресурсы (память и т.д.), Поэтому система может исчерпать ресурсы в случае беспрецедентного потока клиентских запросов.
Пулы потоков решают указанные проблемы:
1) Создание указанного количества потоков при запуске сервера вместо их создания во время выполнения.
2) Ограничение количества потоков, выполняемых в любой момент времени.
Примечание. Вышеприведенное применимо для пулов потоков с фиксированными размерами.
Ответ 4
Вы можете считать, что Threads являются фактическими работниками, а пулы потоков - группой работников. Вы можете создавать несколько групп по различным причинам, таким как приоритет, цель и т.д. Таким образом, хотя один пул может быть для задач общего назначения, таких как фоновые графики, широковещание по электронной почте и т.д., Может быть пул обработки транзакций одновременно обрабатывать несколько транзакций. В случае службы-исполнителя я уверен, что вы не захотите задерживать транзакционные задания, которые должны быть завершены после того, как другие незакритические действия, такие как электронные письма с подтверждением радиовещания или деятельность по обслуживанию базы данных, не будут завершены. Вы можете разделить их на пулы и поддерживать их самостоятельно. Это очень упрощенный ответ, не входя в технические жаргоны. С Уважением, KT
Ответ 5
Простой Google поиск приведет к большому количеству информации о пулах потоков Java и пулах потоков в целом.
Вот несколько полезных ссылок:
Ответ 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