Download - Java 8. Thread pools
![Page 2: Java 8. Thread pools](https://reader030.vdocuments.us/reader030/viewer/2022032616/55a5c8a41a28abf0308b466a/html5/thumbnails/2.jpg)
Пролог. Java Concurrency Timeline
JDK 1.0- JMM - Synchronizers- Thread
JDK 1.2 - Collections
Doug Lea- Concurrency
package
JDK 1.6- Deques
JDK 1.7- ForkJoinPool
JDK 1.8 - java.util.concurrent
JDK 1.5-JMM-java.util.concurrent
1996 1997 1998 2004 2011 20142006
![Page 3: Java 8. Thread pools](https://reader030.vdocuments.us/reader030/viewer/2022032616/55a5c8a41a28abf0308b466a/html5/thumbnails/3.jpg)
Пролог. Пакет java.util.concurrent.*
Executors
AtomicsLocks Synchronizers
QueuesConcurrent collections
![Page 4: Java 8. Thread pools](https://reader030.vdocuments.us/reader030/viewer/2022032616/55a5c8a41a28abf0308b466a/html5/thumbnails/4.jpg)
О чем поговорим сегодня
▪ Что такое пул потоков и для чего он нужен
▪ Интерфейсы и классы взаимодействия с пулами потоков
▪ Фабрика пулов Executors
▪ Классы задач
▪ ForkJoinPool
![Page 5: Java 8. Thread pools](https://reader030.vdocuments.us/reader030/viewer/2022032616/55a5c8a41a28abf0308b466a/html5/thumbnails/5.jpg)
Паттерн Thread pool
Thread PoolJob providers
Task Task Task Task
Job Queue
Task
Worker
Worker
Worker
Worker
Submiter
Submiter
Submiter
![Page 6: Java 8. Thread pools](https://reader030.vdocuments.us/reader030/viewer/2022032616/55a5c8a41a28abf0308b466a/html5/thumbnails/6.jpg)
Job providers. Две стратегии
Создание задачиПередача задания
1. Создаем задачу, которое содержит в себе задание2. Сообщаем задаче, что ей необходимо выполниться
1. Создаем задание – блок кода для, которой должен быть выполнен асинхронно.2. Передаем созданное задание исполнителю
![Page 7: Java 8. Thread pools](https://reader030.vdocuments.us/reader030/viewer/2022032616/55a5c8a41a28abf0308b466a/html5/thumbnails/7.jpg)
Стратегии построения Thread pool
1. Work arbitrage: общий арбитр, разделяющий задачи. Например обычная blocking queue
2. Work dealing: у каждого свой набор задач, перегруженные потоки отдают свои задачи на сторону
3. Work stealing: у каждого свой набор задач, свободные потоки «крадут» задачи у перегруженных потоков
![Page 8: Java 8. Thread pools](https://reader030.vdocuments.us/reader030/viewer/2022032616/55a5c8a41a28abf0308b466a/html5/thumbnails/8.jpg)
Work arbitrage
1. Direct handoffs: напрямую передаем задание свободному работнику, либо конструируем новый
2. Unbounded queues: задание попадает в очередь, из которой свободные работники забирают задания. Очередь не ограничена, число работников фиксированное
3. Bounded queues: задание попадает в очередь, из которой свободные работники забирают задания. Очередь и число работников ограничены
![Page 9: Java 8. Thread pools](https://reader030.vdocuments.us/reader030/viewer/2022032616/55a5c8a41a28abf0308b466a/html5/thumbnails/9.jpg)
Интерфейсы пулов
Executor
ExecutorService
ScheduledExecutorService
![Page 10: Java 8. Thread pools](https://reader030.vdocuments.us/reader030/viewer/2022032616/55a5c8a41a28abf0308b466a/html5/thumbnails/10.jpg)
ThreadPoolExecutor
Реализации пулов
ScheduledThreadPoolExecutor
![Page 11: Java 8. Thread pools](https://reader030.vdocuments.us/reader030/viewer/2022032616/55a5c8a41a28abf0308b466a/html5/thumbnails/11.jpg)
Реализации заданий
![Page 12: Java 8. Thread pools](https://reader030.vdocuments.us/reader030/viewer/2022032616/55a5c8a41a28abf0308b466a/html5/thumbnails/12.jpg)
Получение результата. Паттерн Future
Future<V>
![Page 13: Java 8. Thread pools](https://reader030.vdocuments.us/reader030/viewer/2022032616/55a5c8a41a28abf0308b466a/html5/thumbnails/13.jpg)
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 8. Thread pools](https://reader030.vdocuments.us/reader030/viewer/2022032616/55a5c8a41a28abf0308b466a/html5/thumbnails/14.jpg)
Классы задач. RecursiveTask<V>
![Page 15: Java 8. Thread pools](https://reader030.vdocuments.us/reader030/viewer/2022032616/55a5c8a41a28abf0308b466a/html5/thumbnails/15.jpg)
Классы задач. RecursiveAction
![Page 16: Java 8. Thread pools](https://reader030.vdocuments.us/reader030/viewer/2022032616/55a5c8a41a28abf0308b466a/html5/thumbnails/16.jpg)
Классы задач. CompletableFuture<V>
Sync Async Sync Async
![Page 17: Java 8. Thread pools](https://reader030.vdocuments.us/reader030/viewer/2022032616/55a5c8a41a28abf0308b466a/html5/thumbnails/17.jpg)
ForkJoinPool
Все потоки ждут на join() пока выполнится один
Или вообще оказывается, что очередную задачу некому выполнить
join()
join()join()
join()
join()
join()
join()
join()
join()
join()
![Page 18: Java 8. Thread pools](https://reader030.vdocuments.us/reader030/viewer/2022032616/55a5c8a41a28abf0308b466a/html5/thumbnails/18.jpg)
ForkJoinPool
1. Собственный пул: ForkJoinPool pool=new ForkJoinPool(int n);2. Общий пул: ForkJoinPool.commonPool() ;
• extends ExecutorService• принимает на исполнение Runnable, Callable, ForkJoinTask• внешне взаимодействие выглядит как с обычным пулом
Получить:
![Page 19: Java 8. Thread pools](https://reader030.vdocuments.us/reader030/viewer/2022032616/55a5c8a41a28abf0308b466a/html5/thumbnails/19.jpg)
ForkJoinPool
………..
Worker queues
Submiters queues
………..
head tail
head tail
WorkerOther
workers
Submiters
![Page 20: Java 8. Thread pools](https://reader030.vdocuments.us/reader030/viewer/2022032616/55a5c8a41a28abf0308b466a/html5/thumbnails/20.jpg)
ForkJoinPool. Производительность
![Page 21: Java 8. Thread pools](https://reader030.vdocuments.us/reader030/viewer/2022032616/55a5c8a41a28abf0308b466a/html5/thumbnails/21.jpg)
Использованные источники
▪ Обзор 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 8. Thread pools](https://reader030.vdocuments.us/reader030/viewer/2022032616/55a5c8a41a28abf0308b466a/html5/thumbnails/22.jpg)
Использованные источники
▪ 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 8. Thread pools](https://reader030.vdocuments.us/reader030/viewer/2022032616/55a5c8a41a28abf0308b466a/html5/thumbnails/23.jpg)
Спасибо за внимание!