23
Накрайников Олег [email protected] Java 8. Thread Pools Java. The well-known and not well-known

Java 8. Thread pools

Embed Size (px)

Citation preview

Page 1: Java 8. Thread pools

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

Java 8. Thread Pools

Java. The well-known and not well-known

Page 2: Java 8. Thread pools

Пролог. 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

Пролог. Пакет java.util.concurrent.*

Executors

AtomicsLocks Synchronizers

QueuesConcurrent collections

Page 4: Java 8. Thread pools

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

▪ Что такое пул потоков и для чего он нужен

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

▪ Фабрика пулов Executors

▪ Классы задач

▪ ForkJoinPool

Page 5: Java 8. Thread pools

Паттерн 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

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

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

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

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

Page 7: Java 8. Thread pools

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

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

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

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

Page 8: Java 8. Thread pools

Work arbitrage

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

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

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

Page 9: Java 8. Thread pools

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

Executor

ExecutorService

ScheduledExecutorService

Page 10: Java 8. Thread pools

ThreadPoolExecutor

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

ScheduledThreadPoolExecutor

Page 11: Java 8. Thread pools

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

Page 12: Java 8. Thread pools

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

Future<V>

Page 13: Java 8. Thread pools

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

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

Page 15: Java 8. Thread pools

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

Page 16: Java 8. Thread pools

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

Sync Async Sync Async

Page 17: Java 8. Thread pools

ForkJoinPool

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

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

join()

join()join()

join()

join()

join()

join()

join()

join()

join()

Page 18: Java 8. Thread pools

ForkJoinPool

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

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

Получить:

Page 19: Java 8. Thread pools

ForkJoinPool

………..

Worker queues

Submiters queues

………..

head tail

head tail

WorkerOther

workers

Submiters

Page 20: Java 8. Thread pools

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

Page 21: Java 8. Thread pools

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

▪ Обзор 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

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

▪ 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

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