Статьи

Как создавать пулы потоков с использованием Java 5 Executor Framework

Java 5 представила Пул потоков в Java в форме среды Executor, которая позволяет Java-программисту отделить передачу задачи к ее выполнению. Если вы занимаетесь программированием на сервере на Java, пул потоков является важной концепцией для поддержания масштабируемости, надежности и стабильности системы. Для тех, кто не знаком с пулом потоков в Java или понятием пула потоков, здесь есть один вкладыш. Пул потоков в Java — это пул рабочих потоков, который готов выполнить любую заданную им задачу, в основном в форме реализации Runnable. или вызываемый интерфейс. Поскольку Java поддерживает многопоточность в самом языке программирования, она позволяет одновременно запускать несколько потоков и выполнять параллельную обработку задачи. В этой статье мы узнаем следующие вещи о пуле потоков в Java:

  1. Что такое пул потоков в Java?
  2. Зачем нам нужен пул потоков в Java?
  3. Что такое платформа Executor в Java 5?
  4. Как создать пул потоков фиксированного размера, используя платформу Executor в Java?
  5. Преимущества использования Thread Pool в Java?

Что такое Thread Pool в Java и зачем он нам нужен

JavaSparrow-мед
Как я уже говорил, пул потоков — это пул уже созданного рабочего потока, готового выполнить эту работу. Пул потоков является одним из основных средств, который требуется многопоточному серверному приложению Java. Одним из примеров использования пула потоков является создание веб-сервера, который обрабатывает запрос клиента. Если вы знакомы с программированием сокетов, вы знаете, что ServerSocket.accept () является методом блокировки и блокируется до тех пор, пока не будет установлено соединение с сокетом. Если для обработки клиентского запроса используется только один поток, он впоследствии ограничивает количество клиентов, которые могут одновременно обращаться к серверу. Чтобы поддерживать большое количество клиентов, вы можете решить использовать одну нить для каждой парадигмы запроса, в которой каждый запрос обрабатывается отдельной нитью, но для этого требуется создание нити при поступлении запроса. Поскольку создание потока занимает много времени, оно задерживает обработку запроса. Он также ограничивает количество клиентов в зависимости от того, сколько потоков в JVM разрешено, что, очевидно, является ограниченным числом. Пул потоков решает эту проблему для вас, создает потоки и управляет ими. Вместо того чтобы создавать поток и отбрасывать его после выполнения задачи, пул потоков повторно использует потоки в форме рабочего потока. Поскольку потоки обычно создаются и объединяются при запуске приложения, ваш сервер может немедленно начать обработку запроса, что может еще больше сократить время отклика сервера. Помимо этого, есть несколько других преимуществ использования пула потоков в приложениях Java, которые мы увидим в следующем разделе. Короче говоря, нам нужны пулы потоков, чтобы лучше управлять потоками и отделять выполнение задач от выполнения. Пул потоков и среда Executor, представленные в Java 5, являются отличным пулом потоков, предоставляемым библиотекой.

Пул потоков Java — платформа Executor в Java 5

Java 5 представила несколько полезных функций, таких как Enum , Generics , аргументы Variable и несколько коллекций параллелизма и утилит, таких как ConcurrentHashMap, BlockingQueue и т. Д. Она также представила полнофункциональную встроенную инфраструктуру Thread Pool, обычно известную как среда Executor . Ядром этой структуры пула потоков является интерфейс Executor, который определяет абстракцию выполнения задачи с помощью метода execute (Runnable task) и ExecutorService, который расширяет Executor, добавляя различные средства управления жизненным циклом и пулом потоков, такие как отключение пула потоков. Платформа Executor также предоставляет статический служебный класс под названием Executors (аналогично Collections), который предоставляет несколько статических фабричных методов для создания различных типов реализации пула потоков в Java, например, пула потоков фиксированного размера, пула кэшированных потоков и пула запланированных потоков.

Интерфейсы Runnable и Callable используются для представления задачи, выполняемой рабочим потоком, управляемым в этих пулах потоков. Интересная особенность инфраструктуры Executor заключается в том, что она основана на шаблоне проектирования потребителя Producer , где поток приложения генерирует потребителей задачи и рабочих потоков или выполняет эти задачи, поэтому он также страдает ограничением задачи потребителя Producer, например, если скорость производства существенно выше, чем потребление чем вы можете запустить OutOfMemory из-за поставленной в очередь задачи, конечно, только если ваша очередь не ограничена.

Как создать пул потоков фиксированного размера, используя платформу Executor в Java?

Создание пула потоков фиксированного размера с использованием среды Java 5 Executor довольно легко из-за статических фабричных методов, предоставляемых классом Executors. Все, что вам нужно сделать, это определить вашу задачу, которую вы хотите выполнить одновременно, и затем отправить эту задачу в ExecutorService. из них пул потоков позаботится о том, как выполнить эту задачу, она может быть выполнена любым свободным рабочим потоком, и, если вас интересует результат, вы можете запросить объект Future, возвращенный методом submit (). Платформа Executor также предоставляет различные виды потоков, например SingleThreadExecutor, который создает только один рабочий поток, или CachedThreadPool, который создает рабочие потоки по мере необходимости. Вы также можете проверить документацию Java Executor Framework для получения полной информации об услугах, предоставляемых этим API. Практический параллелизм Java также содержит несколько глав, посвященных эффективному использованию платформы Java 5 Executor, которую стоит прочитать любому старшему разработчику Java.

Пример пула потоков в Java

Вот пример пула потоков в Java, который использует платформу Executor Java 5 для создания фиксированного пула потоков с числом рабочих потоков равным 10. Затем он создаст задачу и передаст ее в пул потоков для выполнения:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class ThreadPoolExample {
 
    public static void main(String args[]) {
       ExecutorService service = Executors.newFixedThreadPool(10);
       for (int i =0; i<100; i++){
           service.submit(new Task(i));
       }
    }
   
}
 
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

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

Преимущества пула потоков в Java

Пул потоков предлагает несколько преимуществ для Java-приложения, самое большое из которых — это разделение представления задачи на выполнение задачи, что приводит к тому, что более свободно связанная и гибкая конструкция, чем тесно связанная модель создания и выполнения. Вот еще несколько преимуществ использования пула потоков в Java:

  1. Использование пула потоков сокращает время ответа, избегая создания потоков во время обработки запросов или задач.
  2. Использование Thread Pool позволяет вам изменять политику выполнения по мере необходимости. вы можете перейти от одного потока к нескольким потокам, просто заменив реализацию ExecutorService.
  3. Пул потоков в приложении Java повышает стабильность системы, создавая сконфигурированное количество потоков, определяемое исходя из загрузки системы и доступного ресурса.
  4. Thread Pool освобождает разработчика приложений от управления потоками и позволяет сосредоточиться на бизнес-логике.

Это все о Пуле потоков в Java 5. Мы увидели, что такое пул потоков в Java, что такое среда исполнения в Java 5, как создать пул потоков в Java и некоторые преимущества использования пула потоков в приложении Java. Без сомнения, знание пула потоков необходимо для ядра Java-разработчика на стороне сервера, и я предлагаю прочитать « Потоки Java и практику параллелизма в Java», чтобы узнать больше о параллелизме и пуле потоков.

Рекомендуемые книги в этой статье