Что такое пул потоков Java?

Всякий раз, когда вы создаете серверное приложение, потребность в создании нового потока возникает каждый раз, когда поступает запрос. Этот новый запрос является новым потоком, который создается. Рассмотрим пул потоков в Java, показывая его преимущества и недостатки.

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

В пуле потоков создается группа потоков фиксированного размера. Всякий раз, когда задача должна быть предоставлена, один из потоков извлекается и назначается этой задачей поставщиком услуг, как только задание завершается, поток возвращается обратно в пул потоков. Пул потоков предпочтительно используется, потому что активные потоки потребляют системные ресурсы, когда JVM создает слишком много потоков одновременно, системе может не хватить памяти.

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

Риски

Есть несколько рисков, когда вы имеете дело с пулом потоков, например;

  • Утечка потока: Если поток удален из пула для выполнения задачи, но не возвращен обратно к нему, когда задача завершена, происходит утечка потока.
  • Дедлок: в пуле потоков выполняется поток, ожидающий вывода из блока, который поток ожидает в очереди из-за недоступности потока для выполнения, есть случай тупика.
  • Перерасход ресурсов: большее количество потоков, чем требуется оптимальное количество, может вызвать проблемы с истощением, приводящие к перерасходу ресурсов.

Преимущества

Некоторые из преимуществ использования пула потоков при программировании на Java:

  • Лучшая производительность
  • Экономит время
  • Не нужно создавать тему снова и снова
  • Легкий доступ
  • Использование в реальном времени

Недостатки

Некоторые недостатки использования пула потоков при программировании:

  • Нет контроля над приоритетом и состоянием потока, с которым вы работаете.
  • Нет стабильной идентификации, данной потоку, трек не может быть сохранен.
  • Когда существует высокий спрос на пул потоков, процесс может быть удален.
  • Пул потоков может работать некорректно, когда два потока работают параллельно.
  • Существует несколько ситуаций, когда код приложения может зависеть от кода другого приложения, несмотря на надежную изоляцию приложения.

Посмотрите код ниже, чтобы понять концепцию пула потоков в Java.

Код:

package MyPackage;
 
import java.util.concurrent.LinkedBlockingQueue;
 
public class ThreadPool {
private final int nThreads;
private final PoolWorker[] threads;
private final LinkedBlockingQueue<Runnable> queue;
 
public ThreadPool(int Threads) {
this.nThreads = Threads;
queue = new LinkedBlockingQueue<Runnable>();
threads = new PoolWorker[Threads];
 
for (int i = 0; i < nThreads; i++) {
threads[i] = new PoolWorker();
threads[i].start();
}
}
 
public void execute(Runnable task) {
synchronized (queue) {
queue.add(task);
queue.notify();
}
}
 
private class PoolWorker extends Thread {
public void run() {
Runnable task;
 
while (true) {
synchronized (queue) {
while (queue.isEmpty()) {
try {
queue.wait();
} catch (InterruptedException e) {
System.out.println("An error occurred while queue is waiting: " + e.getMessage());
}
}
task = (Runnable)queue.poll();
}
 
// If we don't catch RuntimeException,
// the pool could leak threads
try {
task.run();
} catch (RuntimeException e) {
System.out.println("Thread pool is interrupted due to an issue: " + e.getMessage());
}
}
}
}
}

Оцените статью