Java Concurrent: ExecutorService

Написано 14 Ноябрь, 2013 в категории Кладовая

ExecutorService - это интерфейс для различных видов пула потоков. Реализации интерфейса java.util.concurrent.ExecutorService позволяют запускать параллельное выполнение задач.

Пример:

1
2
3
4
5
6
7
ExecutorService executorService = Executors.newFixedThreadPool(10);
executorService.execute(new Runnable() {
    public void run() {
        System.out.println("Asynchronous task");
    }
});
executorService.shutdown();

В консоль будет выведена строка: "Asynchronous task".

Разберем программу построчно:
1 строка: создаем экземпляр пула потоков типа FixedThread. При создании этого пула в нем создается 10 потоков, которые будут запускать передаваемые пулу задачи.
2 строка: выполняем задачу по выводу строки "Asynchronous task". Метод execute() передает задачу одному из свободных потоков в пуле, поэтому строка будет выведена только один раз.
3 строка: останавливаем все потоки пула.
Если вы решите использовать данный пример как основу для написания своей программы, то Вы скорее всего столкнетесь с одной неожиданностью. В данной программе задача, которую выполняет ExcecutorService настолько короткая, что успевает выполниться до того как в основном потоке будет выполнена остановка пула (3 строка), но в "реальных" программах задачи как правило более функциональные и выполняются дольше, поэтому может возникнуть ситуация когда задача еще не окончена, а мы уже закрываем пул. Выходом из этой ситуации может быть использование вместо метода execute(Runnable), который ничего не возвращает, метода submit(Runnable), который возвращает объект Future. Этот объект позволяет отслеживать статус выполнения задачи потоком.

Реализации интерфейса ExecutotService:
1. ThreadPoolExecutor
2. ScheduledThreadPoolExecutor
3. Executors.newSingleThreadExecutor()
4. Executors.newFixedThreadPool(10)
5. Executors.newScheduledThreadPool(10)

Вольный пересказ статьи http://tutorials.jenkov.com/java-util-concurrent/executorservice.html