Java threads - part 3

23
Накрайников Олег [email protected] Java Threads. Part 3 Java. The well-known and not well-known ThreadPools

Transcript of Java threads - part 3

Page 1: Java threads - part 3

Накрайников Олег[email protected]

Java Threads. Part 3

Java. The well-known and not well-known

ThreadPools

Page 2: Java threads - part 3

Пролог

Page 3: Java threads - part 3

Пакет java.util.concurrent.*

Executors

AtomicsLocks Synchronizers

QueuesConcurrent collections

Page 4: Java threads - part 3

О чем поговорим сегодня

▪ Что такое пул потоков и для чего он нужен▪ Интерфейсы и классы взаимодействия с пулами

потоков▪ Фабрика пулов Executors▪ Классы задач▪ ForkJoinPool

Page 5: Java threads - part 3

Паттерн Thread pool

Thread PoolJob providers

Task Task Task Task

Job Queue

Task

Worker

Worker

Worker

Worker

Submiter

Submiter

Submiter

Page 6: Java threads - part 3

Job providers. Две стратегии

Создание задачиПередача задания

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

1. Создаем задание – блок кода для, которой должен быть выполнен асинхронно.2. Передаем созданное задание исполнителю

Page 7: Java threads - part 3

Стратегии построения Thread pool

1. Work arbitrage: общий арбитр, разделяющий задачи. Например обычная blocking queue

2. Work dealing: у каждого свой набор задач, перегруженные потоки отдают свои задачи на сторону

3. Work stealing: у каждого свой набор задач, свободные потоки «крадут» задачи у перегруженных потоков

Page 8: Java threads - part 3

Work arbitrage

1. Direct handoffs: напрямую передаем задание свободному работнику, либо конструируем новый

2. Unbounded queues: задание попадает в очередь, из которой свободные работники забирают задания. Очередь не ограничена, число работников фиксированное

3. Bounded queues: задание попадает в очередь, из которой свободные работники забирают задания. Очередь и число работников ограничены

Page 9: Java threads - part 3

Интерфейсы пулов

Executor

ExecutorService

ScheduledExecutorService

Page 10: Java threads - part 3

ThreadPoolExecutor

Реализации пулов

ScheduledThreadPoolExecutor

Page 11: Java threads - part 3

Реализации заданий

Page 12: Java threads - part 3

Получение результата. Паттерн Future

Future<V>

Page 13: Java threads - part 3

Executors

Метод Описание

Executors.newCachedThreadPool() Core=0, Max = Integer.MAX_VALUE, AliveTime = 60 sec, Queue = SynchronousQueue

Executors.newFixedThreadPool(int n) Core=n, Max = n, AliveTime = 0 sec, Queue = LinkedBlockingQueue

Executors.newSingleThreadExecutor() Core=1, Max = 1, AliveTime = 0 sec, Queue = LinkedBlockingQueue

Executors.newScheduledThreadPool(int n) Core=n, Max = Integer.MAX_VALUE, AliveTime = 0 sec, Queue = DelayedWorkQueue

Executors.newSingleThreadScheduledExecutor() Core=1, Max = 1, AliveTime = 0 sec, Queue = DelayedWorkQueue

Executors.newWorkStealingPool()Executors.newWorkStealingPool(int n)

parallelism = Runtime.getRuntime().availableProcessors()parallelism = n

Page 14: Java threads - part 3

Классы задач. RecursiveTask<V>

Page 15: Java threads - part 3

Классы задач. RecursiveAction

Page 16: Java threads - part 3

Классы задач. CompletableFuture<V> Sync Async Sync Async

Page 17: Java threads - part 3

ForkJoinPool

Все потоки ждут на join() пока выполнится один

Или вообще оказывается, что очередную задачу некому выполнить

join()join()

join()

join()

join()

join()

join()

join()

join()

join()

Page 18: Java threads - part 3

ForkJoinPool

1. Собственный пул: ForkJoinPool pool=new ForkJoinPool(int n);2. Общий пул: ForkJoinPool.commonPool() ;

• extends ExecutorService• принимает на исполнение Runnable, Callable, ForkJoinTask• внешне взаимодействие выглядит как с обычным пулом

Получить:

Page 19: Java threads - part 3

ForkJoinPool

………..

Worker queues

Submiters queues

………..

head tail

head tail

Worker Other workers

Submiters

Page 20: Java threads - part 3

ForkJoinPool. Производительность

Page 21: Java threads - part 3

Использованные источники

▪ Обзор java.util.concurrent.* [http://habrahabr.ru/company/luxoft/blog/157273/]

▪ Дмитрий Чуйко — Новинки в java.util.concurrent [https://www.youtube.com/watch?v=aMQJnigGvfY&list=PLVe-2wcL84b8T9aw7AaAj-Kir3CKABg55]

▪ Алексей Шипилёв — ForkJoinPool в Java 8 [https://www.youtube.com/watch?v=t0dGLFtRR9c&list=PLVe-2wcL84b8T9aw7AaAj-Kir3CKABg55]

▪ Кей С. Хорстманн – Java SE 8. Вводный курс

Page 22: Java threads - part 3

Использованные источники

▪ Basic Java 7 Fork/Join Benchmark [http://joerglenhard.wordpress.com/2011/09/28/basic-java-7-forkjoin-benchmark/]

▪ Путеводитель по методам класса java.util.concurrent.CompletableFuture [http://habrahabr.ru/post/213319/]

Page 23: Java threads - part 3

Спасибо за внимание!