Статьи

Учебник по параллелизму Java – Пулы потоков

Одним из наиболее полезных улучшений параллелизма, появившихся в Java 1.5, стало введение настраиваемых пулов потоков. Эти пулы потоков дают вам небольшой контроль над такими вещами, как количество потоков, повторное использование потоков, планирование и построение потоков. Давайте рассмотрим это.

Во-первых, потоки потоков. Давайте углубимся в java.util.concurrent.ExecutorService , который предоставляет нам базовый интерфейс для пула потоков. Все пулы потоков позволяют отправлять экземпляры Callable или Runnable для будущего выполнения. Они также предоставляют различные методы управления пулом.

Управление бассейном

Существуют различные методы управления для пулов. Вы можете отключить () пул, который будет отклонять любые будущие отправки, но завершит обработку выполняемых в процессе выполнения и даже тех, которые еще не начались, но были отправлены до начала завершения работы. Вы также можете более агрессивно выполнять shutdownNow (). Это также предотвратит любые будущие представления, но у этого есть несколько других, известных действий. Он не начнет выполнение отправленных, но незапущенных задач. Они будут в возвращенном списке. Он также попытается остановить или, точнее, Thread.interrupt (), выполняющий текущие задачи. Это лучшее усилие без гарантии того, что эти задачи будут успешно прерваны.

ThreadFactory

Через некоторое время мы попадем в класс конструктора java.util.concurrent.Executors, который может создавать различные конфигурации пула потоков, но сначала давайте на секунду сосредоточимся на использовании ThreadFactory. Вы захотите воспользоваться поддержкой ThreadFactory в Executors и иметь привычку предоставлять свою собственную. По умолчанию ThreadFactory предоставит вам пошаговую схему именования нумерованного пула, которая не так уж полезна в журналах и других видах мониторинга. Для первого созданного пула вы получите потоки с именами pool-1-thread-1 , pool-1-thread-2, а второй начинается с pool-2-thread-1 и т. Д. Предоставляя свой собственный ThreadFactory , вы можете есть потоки, названные как ReportProcessingThread1 и HttpThread1 . Вот простой пример:

1
2
3
4
5
6
7
private AtomicLong counter = new AtomicLong();
private String name;
public Thread newThread(Runnable r) {
    Thread t = new Thread(r);
    t.setName(name + counter.incrementAndGet());
    return t;
}

ThreadFactory будет вызываться только при создании нового потока . Учитывая, что пулы потоков JDK будут повторно использовать потоки всякий раз, когда это возможно, этот класс нельзя использовать для управления началом выполнения.

Методы Строителей Исполнителей

Теперь вернемся к методам построения утилит Executors . Они есть:

  • newCachedThreadPool () предоставит вам пул потоков, который будет по возможности использовать потоки, создавая новые по мере необходимости без заданного ограничения.
  • newFixedThreadPool (int nThreads) предоставит вам пул потоков, который будет использовать только до указанного количества потоков, но будет принимать столько задач, сколько представлено для выполнения, выполняя их в порядке отправки.
  • newScheduledThreadPool (int corePoolSize) используется специально для планирования потоков с отложенным выполнением, при повторяющемся расписании с повторяющейся задержкой. Возвращенный пул потоков реализует ScheduledExecutorService, который предоставляет расписание дополнительных методов планирования (команда Runnable, длинная задержка, блок TimeUnit) , scheduleAtFixedRate (команда Runnable, длинный initialDelay, длинный период, блок TimeUnit) и scheduleWithFixedDelay (команда Runnable, длинная initialDelay, длинная задержка, Блок TimeUnit) .
  • newSingleThreadExecutor () и newSingleThreadScheduledExecutor () . Это не накладывает ограничений на количество задач, которые могут быть отправлены, а только гарантирует, что один поток / задача выполняется одновременно.

Наконец, есть несколько вспомогательных методов для создания экземпляров Callable из Runnable . Это вводит нас во вновь созданные конструкции, позволяющие потокам генерировать исключения и возвращать значения, что раньше нам приходилось мучительно обходить. Мы рассмотрим их и как они используются с этими пулами потоков в нашем следующем посте.

Ссылка: Java Concurrency Part 3 — Пулы потоков от наших партнеров JCG в блоге Carfey Software .

Статьи по Теме :