Post on 13-Feb-2017
transcript
Накрайников Олегuchonyy@gmail.com
Java Threads. Part 3
Java. The well-known and not well-known
ThreadPools
Пролог
Пакет java.util.concurrent.*
Executors
AtomicsLocks Synchronizers
QueuesConcurrent collections
О чем поговорим сегодня
▪ Что такое пул потоков и для чего он нужен▪ Интерфейсы и классы взаимодействия с пулами
потоков▪ Фабрика пулов Executors▪ Классы задач▪ ForkJoinPool
Паттерн Thread pool
Thread PoolJob providers
Task Task Task Task
Job Queue
Task
Worker
Worker
Worker
Worker
Submiter
Submiter
Submiter
Job providers. Две стратегии
Создание задачиПередача задания
1. Создаем задачу, которое содержит в себе задание2. Сообщаем задаче, что ей необходимо выполниться
1. Создаем задание – блок кода для, которой должен быть выполнен асинхронно.2. Передаем созданное задание исполнителю
Стратегии построения Thread pool
1. Work arbitrage: общий арбитр, разделяющий задачи. Например обычная blocking queue
2. Work dealing: у каждого свой набор задач, перегруженные потоки отдают свои задачи на сторону
3. Work stealing: у каждого свой набор задач, свободные потоки «крадут» задачи у перегруженных потоков
Work arbitrage
1. Direct handoffs: напрямую передаем задание свободному работнику, либо конструируем новый
2. Unbounded queues: задание попадает в очередь, из которой свободные работники забирают задания. Очередь не ограничена, число работников фиксированное
3. Bounded queues: задание попадает в очередь, из которой свободные работники забирают задания. Очередь и число работников ограничены
Интерфейсы пулов
Executor
ExecutorService
ScheduledExecutorService
ThreadPoolExecutor
Реализации пулов
ScheduledThreadPoolExecutor
Реализации заданий
Получение результата. Паттерн Future
Future<V>
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
Классы задач. RecursiveTask<V>
Классы задач. RecursiveAction
Классы задач. CompletableFuture<V> Sync Async Sync Async
ForkJoinPool
Все потоки ждут на join() пока выполнится один
Или вообще оказывается, что очередную задачу некому выполнить
join()join()
join()
join()
join()
join()
join()
join()
join()
join()
ForkJoinPool
1. Собственный пул: ForkJoinPool pool=new ForkJoinPool(int n);2. Общий пул: ForkJoinPool.commonPool() ;
• extends ExecutorService• принимает на исполнение Runnable, Callable, ForkJoinTask• внешне взаимодействие выглядит как с обычным пулом
Получить:
ForkJoinPool
………..
Worker queues
Submiters queues
………..
head tail
head tail
Worker Other workers
Submiters
ForkJoinPool. Производительность
Использованные источники
▪ Обзор 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. Вводный курс
Использованные источники
▪ 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/]
Спасибо за внимание!