Пакет java.util.concurrent

Утилитарные классы, обычно полезные в многопоточной программировании. Этот пакет включает несколько небольших стандартизированных расширяемых фреймворков, а также некоторые классы, которые предоставляют полезную функциональность и в противном случае являются утомительными или трудно реализуемыми. Вот краткие описания основных компонентов. См. также пакеты java.util.concurrent.locks и java.util.concurrent.atomic.

Исполнители

Интерфейсы. Executor — это простой стандартизированный интерфейс для определения пользовательских подсистем потоков, включая пулы потоков, асинхронное ввод-вывод и легкие фреймворки задач. В зависимости от того, какой конкретный класс Executor используется, задачи могут выполняться в новом созданном потоке, существующем потоке выполнения задач или потоке, вызывающем execute, и могут выполняться последовательно или параллельно. ExecutorService предоставляет более полный фреймворк для асинхронного выполнения задач. ExecutorService управляет очередью и планированием задач и позволяет контролируемую остановку. Подинтерфейс ScheduledExecutorService и связанные интерфейсы добавляют поддержку выполнения задач с задержкой и периодически. ExecutorServices предоставляют методы для организации асинхронного выполнения любой функции, выраженной как Callable, аналог Runnable с возвращаемым результатом. Future возвращает результаты функции, позволяет определить, завершено ли выполнение, и предоставляет способ отмены выполнения. RunnableFuture является Future, который обладает методом run, который при выполнении устанавливает свои результаты.

Реализации. Классы ThreadPoolExecutor и ScheduledThreadPoolExecutor предоставляют настраиваемые, гибкие пулы потоков. Класс Executors предоставляет фабричные методы для наиболее распространенных типов и конфигураций Executors, а также несколько утилитарных методов для их использования. Другие утилиты на основе Executors включают конкретный класс FutureTask, предоставляющий общую расширяемую реализацию Futures, и ExecutorCompletionService, который помогает в координации обработки групп асинхронных задач.

Класс ForkJoinPool предоставляет Executor, в первую очередь предназначенный для обработки экземпляров ForkJoinTask и его подклассов. Эти классы используют планировщик с кражей работы, который обеспечивает высокую пропускную способность для задач, соответствующих ограничениям, которые часто действуют в ресурсоемком параллельном программировании.

Очереди

Класс ConcurrentLinkedQueue предоставляет эффективную масштабируемую потокобезопасную непомеховую очередь FIFO. Класс ConcurrentLinkedDeque аналогичен, но дополнительно поддерживает интерфейс Deque.

Пять реализаций в java.util.concurrent поддерживают расширенный интерфейс BlockingQueue, который определяет блокирующие версии put и take: LinkedBlockingQueue, ArrayBlockingQueue, SynchronousQueue, PriorityBlockingQueue и DelayQueue. Различные классы охватывают наиболее распространенные контексты использования для производителей-потребителей, обмена сообщениями, параллельного задания и родственных многопоточных конструкций.

Расширенный интерфейс TransferQueue и реализация LinkedTransferQueue вводят синхронный transfer метод (вместе со связанными функциями), в котором производитель может по желанию блокироваться, ожидая своего потребителя.

Интерфейс BlockingDeque расширяет BlockingQueue для поддержки как операций FIFO, так и LIFO (на основе стека). Класс LinkedBlockingDeque предоставляет реализацию.

Временные интервалы

Класс TimeUnit предоставляет несколько гранулярностей (включая наносекунды) для задания и управления операциями с таймаутами. Большинство классов в пакете содержат операции, основанные на таймаутах в дополнение к неопределенным ожиданиям. Во всех случаях, когда используются таймауты, таймаут указывает минимальное время ожидания метода, прежде чем он укажет на таймаут. Реализации прилагают «максимальные усилия», чтобы обнаружить таймауты как можно скорее после их возникновения. Однако может пройти неопределенное количество времени между обнаружением таймаута и фактическим повторным выполнением потока после этого таймаута. Все методы, принимающие параметры таймаута, рассматривают значения меньше или равные нулю как означающие, что ожидание вообще не требуется. Для ожидания «вечно» можно использовать значение Long.MAX_VALUE.

Синхронизаторы

Пять классов помогают в общих специальных синхронизационных идиомах.
  • Semaphore — классический инструмент многопоточности.
  • CountDownLatch — это очень простая, но очень распространенная утилита для блокировки до тех пор, пока не выполнится заданное количество сигналов, событий или условий.
  • CyclicBarrier — это точка многосторонней синхронизации с возможностью сброса, полезная в некоторых стилях параллельного программирования.
  • Phaser предоставляет более гибкую форму барьера, которая может использоваться для управления фазами вычислений среди нескольких потоков.
  • Exchanger позволяет двум потокам обмениваться объектами в точке встречи и полезен в нескольких конвейерных конструкциях.

Конкурентные коллекции

Помимо очередей, этот пакет предоставляет реализации коллекций, предназначенные для использования в многопоточных контекстах: ConcurrentHashMap, ConcurrentSkipListMap, ConcurrentSkipListSet, CopyOnWriteArrayList и CopyOnWriteArraySet. Когда ожидается доступ к данной коллекции многих потоков, ConcurrentHashMap обычно предпочтительнее синхронизированной HashMap, а ConcurrentSkipListMap обычно предпочтительнее синхронизированной TreeMap. CopyOnWriteArrayList предпочтительнее синхронизированного ArrayList в случае, когда ожидаемое количество чтений и обходов значительно превосходит количество обновлений списка.

Префикс «Конкурентный», используемый с некоторыми классами в этом пакете, — это сокращение, указывающее на несколько различий с аналогичными классами «синхронизированными». Например java.util.Hashtable и Collections.synchronizedMap(new HashMap()) синхронизированы. Но ConcurrentHashMap «конкурентный». Конкурентная коллекция потокобезопасна, но не регулируется единственным блокирующим замком. В частности, ConcurrentHashMap безопасно допускает любое количество одновременных чтений и большое количество одновременных записей. Синхронизированные классы могут быть полезны, когда вам нужно предотвратить весь доступ к коллекции с помощью одного замка, за счет снижения масштабируемости. В других случаях, когда ожидается, что несколько потоков будут обращаться к общей коллекции, «конкурентные» версии обычно предпочтительнее. А несинхронизированные коллекции предпочтительнее, когда либо коллекции не разделяются, либо к ним можно получить доступ только при удержании других замков.

Большинство реализаций конкурентных коллекций (включая большинство очередей) также отличаются от обычных java.util соглашений тем, что их Итераторы и Разделители обеспечивают слабо согласованную, а не быструю последовательность обхода:

  • они могут выполняться параллельно с другими операциями
  • они никогда не будут выбрасывать ConcurrentModificationException
  • они гарантируют обход элементов так, как они существовали при создании ровно один раз, и могут (но не гарантируют) отражать любые изменения после создания.

Свойства согласованности памяти

Глава 17 Спецификации языка Java™ определяет отношение happens-before на операциях с памятью, таких как чтение и запись общих переменных. Результаты записи одним потоком гарантируются видимыми для чтения другим потоком только в том случае, если операция записи happens-before операции чтения. Конструкции synchronized и volatile, а также методы Thread.start() и Thread.join() могут образовывать отношения happens-before. В частности:
  • Каждое действие в потоке happens-before каждое действие в этом потоке, которое следует за ним в порядке программы.
  • Разблокировка (synchronized блок или выход из метода) монитора happens-before каждой последующей блокировки (synchronized блок или вход в метод) того же самого монитора. И поскольку отношение happens-before транзитивно, все действия потока до разблокировки happens-before всех действий после любой блокировки монитора этим потоком.
  • Запись в поле volatile happens-before каждого последующего чтения этого же поля. Записи и чтения полей volatile имеют сходные эффекты согласованности памяти, как вход и выход из мониторов, но не предполагают взаимной блокировки.
  • Вызов start в потоке happens-before любого действия в запущенном потоке.
  • Все действия в потоке happens-before любого другого потока, успешно возвращающегося из join в этом потоке.
Методы всех классов в java.util.concurrent и его подпакетах расширяют эти гарантии до синхронизации на более высоком уровне.
  • Действия в потоке перед размещением объекта в любую коллекцию с конкурентным доступом предшествуют действиям, последующим за доступом или удалением этого элемента из коллекции в другом потоке.
  • Действия в потоке перед подачей Runnable в Executor предшествуют началу его выполнения. Аналогично для Callables, поданных в ExecutorService.
  • Действия, выполняемые асинхронным вычислением, представленным Future, предшествуют действиям, последующим за получением результата через Future.get() в другом потоке.
  • Действия перед выполнением методов синхронизатора, таких как Lock.unlock, Semaphore.release, и CountDownLatch.countDown предшествуют действиям, последующим за успешным выполнением метода «приобретения», такого как Lock.lock, Semaphore.acquire, Condition.await, и CountDownLatch.await в том же объекте синхронизации в другом потоке.
  • Для каждой пары потоков, которые успешно обмениваются объектами через Exchanger, действия до exchange() в каждом потоке предшествуют действиям, последующим за соответствующим exchange() в другом потоке.
  • Действия до вызова CyclicBarrier.await и Phaser.awaitAdvance (а также его вариантов) предшествуют действиям, выполняемым действием барьера, и действия, выполняемые действием барьера, предшествуют действиям, последующим за успешным возвращением из соответствующего await в других потоках.
Since:
1.5
Интерфейс Описание
BlockingDeque<E>

A Deque that additionally supports blocking operations that wait for the deque to become non-empty when retrieving an element, and wait for space to become available in the deque when storing an element.

BlockingQueue<E>

A Queue that additionally supports operations that wait for the queue to become non-empty when retrieving an element, and wait for space to become available in the queue when storing an element.

Callable<V>

A task that returns a result and may throw an exception.

CompletableFuture.AsynchronousCompletionTask

A marker interface identifying asynchronous tasks produced by async methods.

CompletionService<V>

A service that decouples the production of new asynchronous tasks from the consumption of the results of completed tasks.

CompletionStage<T>

A stage of a possibly asynchronous computation, that performs an action or computes a value when another CompletionStage completes.

ConcurrentMap<K,​V>

A Map providing thread safety and atomicity guarantees.

ConcurrentNavigableMap<K,​V>

A ConcurrentMap supporting NavigableMap operations, and recursively so for its navigable sub-maps.

Delayed

A mix-in style interface for marking objects that should be acted upon after a given delay.

Executor

An object that executes submitted Runnable tasks.

ExecutorService

An Executor that provides methods to manage termination and methods that can produce a Future for tracking progress of one or more asynchronous tasks.

Flow.Processor<T,​R>

A component that acts as both a Subscriber and Publisher.

Flow.Publisher<T>

A producer of items (and related control messages) received by Subscribers.

Flow.Subscriber<T>

A receiver of messages.

Flow.Subscription

Message control linking a Flow.Publisher and Flow.Subscriber.

ForkJoinPool.ForkJoinWorkerThreadFactory

Factory for creating new ForkJoinWorkerThreads.

ForkJoinPool.ManagedBlocker

Interface for extending managed parallelism for tasks running in ForkJoinPools.

Future<V>

A Future represents the result of an asynchronous computation.

RejectedExecutionHandler

A handler for tasks that cannot be executed by a ThreadPoolExecutor.

RunnableFuture<V>

A Future that is Runnable.

RunnableScheduledFuture<V>

A ScheduledFuture that is Runnable.

ScheduledExecutorService

An ExecutorService that can schedule commands to run after a given delay, or to execute periodically.

ScheduledFuture<V>

A delayed result-bearing action that can be cancelled.

ThreadFactory

An object that creates new threads on demand.

TransferQueue<E>

A BlockingQueue in which producers may wait for consumers to receive elements.

Класс Описание
AbstractExecutorService

Предоставляет реализации по умолчанию методов выполнения ExecutorService.

ArrayBlockingQueue<E>

Ограниченная блокирующая очередь, поддерживаемая массивом.

CompletableFuture<T>

Future, которая может быть явно завершена (установка значения и состояния) и может использоваться как CompletionStage, поддерживающая зависимые функции и действия, которые срабатывают при ее завершении.

ConcurrentHashMap<K,​V>

Хеш-таблица, поддерживающая полную конкурентность для извлечений и высокую ожидаемую конкурентность для обновлений.

ConcurrentHashMap.KeySetView<K,​V>

Вид ConcurrentHashMap как Set ключей, в котором добавления могут быть необязательно включены, отображая на общее значение.

ConcurrentLinkedDeque<E>

Неограниченная конкурентная очередь с двумя концами, основанная на связанных узлах.

ConcurrentLinkedQueue<E>

Неограниченная потокобезопасная очередь, основанная на связанных узлах.

ConcurrentSkipListMap<K,​V>

Масштабируемая конкурентная реализация ConcurrentNavigableMap.

ConcurrentSkipListSet<E>

Масштабируемая конкурентная реализация NavigableSet, основанная на ConcurrentSkipListMap.

CopyOnWriteArrayList<E>

Потокобезопасная версия ArrayList, в которой все изменяющие операции (add, set, и так далее) реализуются путём создания свежей копии базового массива.

CopyOnWriteArraySet<E>

Set, которая использует внутренний CopyOnWriteArrayList для всех своих операций.

CountDownLatch

Средство синхронизации, которое позволяет одному или нескольким потокам ожидать завершения набора операций, выполняемых в других потоках.

CountedCompleter<T>

ForkJoinTask с действием завершения, выполняемым при срабатывании и отсутствии оставшихся ожидающих действий.

CyclicBarrier

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

DelayQueue<E extends Delayed>

Неограниченная блокирующая очередь элементов Delayed, в которой элемент может быть взят только при истечении его отсрочки.

Exchanger<V>

Точка синхронизации, в которой потоки могут объединяться и обмениваться элементами в парах.

ExecutorCompletionService<V>

CompletionService, использующая предоставленный Executor для выполнения задач.

Executors

Фабричные и вспомогательные методы для Executor, ExecutorService, ScheduledExecutorService, ThreadFactory и Callable классов, определённых в этом пакете.

Flow

Взаимосвязанные интерфейсы и статические методы для создания управляемых потоком компонентов, в которых Publishers производят элементы, потребляемые одним или несколькими Subscribers, каждый из которых управляется Subscription.

ForkJoinPool

ExecutorService для запуска ForkJoinTask.

ForkJoinTask<V>

Абстрактный базовый класс для задач, выполняемых в ForkJoinPool.

ForkJoinWorkerThread

Поток, управляемый ForkJoinPool, который выполняет ForkJoinTask.

FutureTask<V>

Отменяемая асинхронная вычисление.

LinkedBlockingDeque<E>

Необязательно ограниченная блокирующая очередь с двумя концами, основанная на связанных узлах.

LinkedBlockingQueue<E>

Необязательно ограниченная блокирующая очередь, основанная на связанных узлах.

LinkedTransferQueue<E>

Неограниченная TransferQueue, основанная на связанных узлах.

Phaser

Многократно используемый барьер синхронизации, похожий по функциональности на CyclicBarrier и CountDownLatch, но поддерживающий более гибкое использование.

PriorityBlockingQueue<E>

Неограниченная блокирующая очередь, использующая те же правила упорядочивания, что и класс PriorityQueue и предоставляющая блокирующие операции извлечения.

RecursiveAction

Рекурсивное бессодержательное ForkJoinTask.

RecursiveTask<V>

Рекурсивная задача с возвращаемым результатом ForkJoinTask.

ScheduledThreadPoolExecutor

ThreadPoolExecutor, который дополнительно может планировать выполнение команд после определённой задержки или периодически.

Semaphore

Счётный семафор.

SubmissionPublisher<T>

Flow.Publisher, которая асинхронно выдает отправленные (не нулевые) элементы текущим подписчикам, пока не будет закрыта.

SynchronousQueue<E>

Блокирующая очередь, в которой каждая операция вставки должна ожидать соответствующей операции удаления другим потоком, и наоборот.

ThreadLocalRandom

Генератор случайных чисел, изолированный для текущего потока.

ThreadPoolExecutor

ExecutorService, который выполняет каждую задачу, используя один из, возможно, нескольких пулов потоков, обычно настраиваемый с помощью Executors фабричных методов.

ThreadPoolExecutor.AbortPolicy

Обработчик отклоненных задач, который выбрасывает RejectedExecutionException.

ThreadPoolExecutor.CallerRunsPolicy

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

ThreadPoolExecutor.DiscardOldestPolicy

Обработчик отклоненных задач, который отбрасывает самую старую необработанную заявку и затем повторно пытается execute, если исполнитель не закрыт, в противном случае задача отбрасывается.

ThreadPoolExecutor.DiscardPolicy

Обработчик отклоненных задач, который безмолвно отбрасывает отклоненную задачу.

Перечисление Описание
TimeUnit

Единица измерения времени представляет длительность во времени в заданной единице измерения и предоставляет вспомогательные методы для преобразования между единицами измерения, а также для выполнения операций тайминга и задержек в этих единицах.

Исключение Описание
BrokenBarrierException

Исключение, выбрасываемое, когда поток пытается подождать барьер, который находится в состоянии разрыва, или который переходит в состояние разрыва, пока поток ожидает.

CancellationException

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

CompletionException

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

ExecutionException

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

RejectedExecutionException

Исключение, выбрасываемое Executor, когда задача не может быть принята для выполнения.

TimeoutException

Исключение, выбрасываемое при истечении времени ожидания блокирующей операции.

© 1993, 2020, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/package-summary.html

Spec-Zone .ru
спецификации, руководства, описания, API