Java threads - part 3

Post on 13-Feb-2017

285 views 1 download

Transcript of Java threads - part 3

Накрайников Олег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/]

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