В предыдущем уроке мы узнали о базовом исполнителе пула потоков с неограниченным возможным количеством потоков в пуле и его примере использования. Теперь давайте рассмотрим пример исполнителя пула потоков фиксированного размера, который поможет улучшить производительность и улучшить использование системных ресурсов за счет ограничения максимального количества потоков в пуле потоков.
1) Создайте задачу для выполнения
Очевидно, первым шагом является наличие задачи, которую вы хотели бы выполнить с помощью исполнителей.
class Task implements Runnable{private String name;public Task(String name){this.name = name;}public String getName() {return name;}@Overridepublic void run(){try{Long duration =(long)(Math.random() * 10);System.out.println("Doing a task during : " + name);TimeUnit.SECONDS.sleep(duration);}catch(InterruptedException e){e.printStackTrace();}}}
2) Выполнение задач с помощью Исполнителей
Теперь все, что вам нужно сделать, это создать экземпляр ThreadPoolExecutor фиксированного размера и передать задачи для выполнения в его метод execute().
package com.howtodoinjava.demo.multithreading;import java.util.concurrent.Executors;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;public class FixedThreadPoolExecutorExample{public static void main(String[] args){ThreadPoolExecutor executor =(ThreadPoolExecutor) Executors.newFixedThreadPool(4);for(int i = 0; i < 10; i++){Task task = new Task("Task " + i);System.out.println("A new task has been added : " + task.getName());executor.execute(task);}System.out.println("Maximum threads inside pool " + executor.getMaximumPoolSize());executor.shutdown();}}Output:A new task has been added : Task 0A new task has been added : Task 1A new task has been added : Task 2A new task has been added : Task 3A new task has been added : Task 4A new task has been added : Task 5A new task has been added : Task 6A new task has been added : Task 7Doing a task during : Task 0Doing a task during : Task 2Doing a task during : Task 1A new task has been added : Task 8Doing a task during : Task 3A new task has been added : Task 9Maximum threads inside pool 4Doing a task during : Task 4Doing a task during : Task 5Doing a task during : Task 6Doing a task during : Task 7Doing a task during : Task 8Doing a task during : Task 9
Важные моменты:
1) Метод newFixedThreadPool() создает исполнитель с максимальным количеством потоков в любой момент времени. Если вы отправите больше задач, чем количество потоков, оставшиеся задачи будут заблокированы до тех пор, пока не появится свободный поток для их обработки. Этот метод получает максимальное количество потоков в качестве параметра, которое вы хотите иметь в своем исполнителе. В вашем случае вы создали исполнитель с четырьмя потоками.
2) Класс Executors также предоставляет метод newSingleThreadExecutor(). Это экстремальный случай исполнителя потока фиксированного размера. Он создает исполнитель только с одним потоком, поэтому он может выполнять только одну задачу за раз.