Топ-100ExecutorService: управление пулом потоков - CodOrbits
LogoCodOrbits

Раздел: Многопоточность

В этом разделе вы узнаете, как использовать многопоточность в Java для повышения производительности и параллельной обработки.

Все разделы
Иконка Многопоточность

ExecutorService: управление пулом потоков

Last updated: 7 мая 2025 г.

Создание потока дорогостоящая операция.

Поэтому можно вместо создания новых потоков переиспользовать те которые завершили свою работу.

ExecutorService помогает поддерживать пул потоков, то есть поддерживает выполнение некоторого фиксированного количества потоков, которые одновременно выполняются.

Также он назначает задачи этим потокам в этом пуле (в пуле всё время находятся те же самые потоки, это важно).

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

Как уже было сказано ExecutorService создает некоторый пул потоков.

Example

Например:

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

То есть потоки в пуле потоков не создаются заново, а переиспользуются.

Search Icon

Это частно может быть полезно в клиент-серверных программах.

То есть представим, что чтобы обработать один запрос клиента сервер создает отдельный поток. Когда серверной программой обрабатываются запросы клиентов, из-за большого количества потоков может увеличиваться время отклика (промежуток времени, который требуется серверу, чтобы обработать запрос извне). То есть требуется дополнительное время для постоянного создания нитей на сервере, что приводит к увеличению времени отклика и чтобы постоянно не создавались потоки на сервере дла обработки запросов, ExecutorService может помочь. То есть запросы будут выполняться в ExecutorService, в котором потоки переиспользуются для обработки запросов клиентов, и если в ExecutorService нет места, запросы становиться в очередь и будут ждать пока освободиться поток в ExecutorService.

Также это полезно тем, что в процессе может создаться лишь ограниченное количество потоков. Благодаря ExecutorService больше заданного в конструкторе количества потоков не создастся и ясное дело ExecutorService экономит ресурсы и время. Достигается желаемая нагрузка и не подвергаются опасности системные ресурсы.

Пример программы:

1import java.io.*;
2import java.util.concurrent.ExecutorService;
3import java.util.concurrent.Executors;
4
5class ServiceExecutorExample {
6    //к этой переменной добавляется
7    //в потоках SomeThread
8    static volatile int j;
9    public static void main(String[] args) {
10        ExecutorService exeServ =
11        //одновременно будет работать
12        //только 10 потоков
13        Executors.newFixedThreadPool(10);
14        for (int i = 0; i < 1000; i++) {
15            //в этом цикле 10 потоков будет
16            //переполнены 100 раз.
17
18            //Запустить поток в ExecutorService.
19            exeServ.submit(new SomeThread());
20
21            //Если бы мы запускали здесь потоки
22            //стандартным образом то создалось
23            //бы 1000 потоков.
24        }
25        try {
26            Thread.sleep(1000);
27        } catch (InterruptedException e){}
28        //завершить ExecutorService
29        exeServ.shutdown();
30        System.out.println("Counter: " + j);
31    }
32
33    static class SomeThread implements Runnable{
34        @Override
35        public void run(){
36            try{
37                for (int i = 0; i < 100; i++){
38                    j++;
39                }
40            } catch(Exception e){}
41        }
42    }
43}

Вывод:

То есть ExecutorService нам нужен чтобы некоторое количество потоков, некоторое продолжительное время переиспользовалось для выполнения каких-либо задач.


Следующие уроки

ReadWriteLock в Java

15
мин.

Similar Articles Icon
Divider

ThreadLocal в Java: переменные потока

16
мин.

Similar Articles Icon
Divider

Fork/Join framework в Java

18
мин.

Similar Articles Icon