Пакет 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 включают конкретный класс 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позволяет двум потокам обмениваться объектами в точке встречи и полезен в нескольких конструкциях конвейеров.
Конкурентные коллекции
Помимо очередей, этот пакет предоставляет реализации Collection, предназначенные для использования в многопоточных контекстах:ConcurrentHashMap, ConcurrentSkipListMap, ConcurrentSkipListSet, CopyOnWriteArrayList и CopyOnWriteArraySet. Когда ожидается, что многие потоки будут обращаться к заданной коллекции, обычно предпочтительнее ConcurrentHashMap по сравнению со синхронизированной HashMap, а ConcurrentSkipListMap обычно предпочтительнее синхронизированной TreeMap. CopyOnWriteArrayList предпочтительнее синхронизированной ArrayList, когда ожидаемое количество чтений и проходов значительно превышает количество обновлений в списке. Префикс «Concurrent», используемый с некоторыми классами в этом пакете, — это сокращение, указывающее на несколько различий от аналогичных классов «synchronized». Например, java.util.Hashtable и Collections.synchronizedMap(new HashMap()) синхронизированы. Но ConcurrentHashMap — «конкурентный». Конкурентная коллекция потокобезопасна, но не управляется одним блокирующим замком. В частности, в случае ConcurrentHashMap она безопасно допускает любое количество одновременных чтений, а также большое количество одновременных записей. Классы «synchronized» могут быть полезны, когда вам нужно предотвратить весь доступ к коллекции с помощью одного замка, ценой меньшей масштабируемости. В других случаях, когда ожидается доступ к общей коллекции со стороны нескольких потоков, «конкурентные» версии обычно предпочтительнее. А несинхронизированные коллекции предпочтительнее, когда либо коллекции не общие, либо к ним можно получить доступ только при удержании других замков.
Большинство реализаций конкурентных коллекций (включая большинство очередей) также отличаются от обычных java.util соглашений тем, что их итераторы и разделители предоставляют слабо согласованную, а не быстропроходную обработку:
- они могут выполняться параллельно с другими операциями
- они никогда не будут выбрасывать
ConcurrentModificationException - они гарантируют прохождение элементов, существовавших при построении ровно один раз, и могут (но не гарантировано) отражать любые изменения после построения.
Свойства согласованности памяти
Глава 17 спецификации языка Java определяет отношение «происходит до» для операций с памятью, таких как чтение и запись общих переменных. Результаты записи одним потоком гарантированы видимыми при чтении другим потоком только в том случае, если операция записи происходит до операции чтения. Конструкцииsynchronized и volatile, а также методы Thread.start() и Thread.join() могут образовывать отношения «происходит до». В частности: - Каждое действие в потоке предшествует каждому действию в этом потоке, которое следует за ним в порядке программы.
- Разблокировка (
synchronizedблока или выхода из метода) монитора предшествует каждой последующей блокировке (synchronizedблока или входу в метод) того же самого монитора. И поскольку отношение предшествует транзитивно, все действия потока до разблокировки предшествуют всем действиям после блокировки этого монитора другим потоком. - Запись в поле
volatileпредшествует каждой последующей операции чтения этого же поля. Записи и чтения полейvolatileобладают аналогичными эффектами согласованности памяти, как вход и выход из мониторов, но не подразумевают взаимной исключающей блокировки. - Вызов
startв потоке предшествует любому действию в запущенном потоке. - Все действия в потоке предшествуют любому другому потоку, который успешно возвращается из
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в других потоках.
- См. Спецификацию языка Java:
- 17.4.5 Порядок предшествования
- С:
- 1.5
| Класс | Описание |
|---|---|
| AbstractExecutorService | Предоставляет реализации по умолчанию для методов выполнения ExecutorService. |
| ArrayBlockingQueue<E> | Ограниченная блокирующая очередь, реализованная с помощью массива. |
| 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. |
| BrokenBarrierException | Исключение, выбрасываемое, когда поток пытается дождаться барьера, находящегося в состоянии разрыва, или который переходит в состояние разрыва, пока поток ожидает. |
| Callable<V> | Задача, возвращающая результат и которая может выбросить исключение. |
| CancellationException | Исключение, указывающее, что результат задачи, производящей значение, такой как FutureTask, не может быть получен, потому что задача была отменена. |
| CompletableFuture<T> | A Future that may be explicitly completed (setting its value and status), and may be used as a CompletionStage, supporting dependent functions and actions that trigger upon its completion. |
| CompletableFuture.AsynchronousCompletionTask | A marker interface identifying asynchronous tasks produced by async methods. |
| CompletionException | Исключение, выбрасываемое, когда при выполнении завершения результата или задачи возникает ошибка или другое исключение. |
| CompletionService<V> | Сервис, который разделяет создание новых асинхронных задач от потребления результатов завершенных задач. |
| CompletionStage<T> | Стадия, возможно, асинхронного вычисления, выполняющая действие или вычисляющая значение, когда другая CompletionStage завершается. |
|
ConcurrentHashMap<K, |
Таблица хешей, поддерживающая полную конкурентность извлечений и высокую ожидаемую конкурентность обновлений. |
|
ConcurrentHashMap.KeySetView<K, |
Вид ConcurrentHashMap как Set ключей, в котором добавления могут быть необязательно включены путем сопоставления с общим значением. |
| ConcurrentLinkedDeque<E> | Неограниченная конкурентная очередь с двумя сторонами на основе связанных узлов. |
| ConcurrentLinkedQueue<E> | Неограниченная потокобезопасная очередь на основе связанных узлов. |
|
ConcurrentMap<K, |
A Map providing thread safety and atomicity guarantees. |
|
ConcurrentNavigableMap<K, |
A ConcurrentMap supporting NavigableMap operations, and recursively so for its navigable sub-maps. |
|
ConcurrentSkipListMap<K, |
Реализация масштабируемой конкурентной ConcurrentNavigableMap. |
| ConcurrentSkipListSet<E> | Реализация масштабируемой конкурентной NavigableSet на основе ConcurrentSkipListMap. |
| CopyOnWriteArrayList<E> | Потокобезопасная разновидность ArrayList, в которой все операции изменения (add, set, и т. д.) реализуются путем создания новой копии базового массива. |
| CopyOnWriteArraySet<E> | A Set that uses an internal CopyOnWriteArrayList for all of its operations. |
| CountDownLatch | Средство синхронизации, позволяющее одному или нескольким потокам ожидать завершения набора операций, выполняемых в других потоках. |
| CountedCompleter<T> | A ForkJoinTask with a completion action performed when triggered and there are no remaining pending actions. |
| CyclicBarrier | Средство синхронизации, которое позволяет набору потоков ожидать друг друга, чтобы достичь общей точки барьера. |
| Delayed | Интерфейс в стиле mix-in для маркировки объектов, которые должны быть обработаны после определенного задержки. |
| DelayQueue<E extends Delayed> | Неограниченная блокирующая очередь элементов Delayed, в которой элемент, как правило, становится допустимым для удаления, когда истекает его задержка. |
| Exchanger<V> | Точка синхронизации, в которой потоки могут объединяться и обмениваться элементами в парах. |
| ExecutionException | Исключение, вызываемое при попытке извлечь результат задачи, прерванной выбросом исключения. |
| Executor | Объект, выполняющий предоставленные Runnable задачи. |
| ExecutorCompletionService<V> | A CompletionService that uses a supplied Executor to execute tasks. |
| Executors | Методы-фабрики и вспомогательные методы для Executor, ExecutorService, ScheduledExecutorService, ThreadFactory и Callable классов, определенных в этом пакете. |
| ExecutorService |
| Flow | Взаимосвязанные интерфейсы и статические методы для создания компонентов с управлением потоком, в которых Publishers производят элементы, потребляемые одним или несколькими Subscribers, каждый из которых управляется Subscription. |
|
Flow.Processor<T, |
Компонент, который действует как подписчик и издатель одновременно. |
| Flow.Publisher<T> | Производитель элементов (и связанных управляющих сообщений), получаемых подписчиками. |
| Flow.Subscriber<T> | Получатель сообщений. |
| Flow.Subscription | Управление сообщениями, связывающими Flow.Publisher и Flow.Subscriber. |
| ForkJoinPool | A ExecutorService для запуска ForkJoinTask. |
| ForkJoinPool.ForkJoinWorkerThreadFactory | Фабрика для создания новых ForkJoinWorkerThread. |
| ForkJoinPool.ManagedBlocker | Интерфейс для расширения управляемой параллельности для задач, выполняемых в ForkJoinPool. |
| ForkJoinTask<V> | Абстрактный базовый класс для задач, выполняемых в ForkJoinPool. |
| ForkJoinWorkerThread | Поток, управляемый ForkJoinPool, который выполняет ForkJoinTask. |
| Future<V> | A Future представляет собой результат асинхронного вычисления. |
| Future.State | Представляет состояние вычисления. |
| FutureTask<V> | Отменяемое асинхронное вычисление. |
| LinkedBlockingDeque<E> | Необязательно ограниченная блокирующая очередь на основе связанных узлов. |
| LinkedBlockingQueue<E> | Необязательно ограниченная блокирующая очередь на основе связанных узлов. |
| LinkedTransferQueue<E> | Неограниченная TransferQueue на основе связанных узлов. |
| Phaser | Многократное используемый барьер синхронизации, аналогичный по функциональности CyclicBarrier и CountDownLatch, но поддерживающий более гибкое использование. |
| PriorityBlockingQueue<E> | Неограниченная блокирующая очередь, которая использует те же правила упорядочения, что и класс PriorityQueue и предоставляет блокирующие операции извлечения. |
| RecursiveAction | Рекурсивная безадресная ForkJoinTask. |
| RecursiveTask<V> | Рекурсивная задача с результатом ForkJoinTask. |
| RejectedExecutionException | Исключение, выбрасываемое Executor при невозможности принять задачу для выполнения. |
| RejectedExecutionHandler | Обработчик задач, которые не могут быть выполнены ThreadPoolExecutor. |
| RunnableFuture<V> | |
| RunnableScheduledFuture<V> | A ScheduledFuture который является Runnable. |
| ScheduledExecutorService | A ExecutorService который может планировать выполнение команд после заданной задержки или периодически. |
| ScheduledFuture<V> | Действие с задержкой и результатом, которое можно отменить. |
| ScheduledThreadPoolExecutor | A ThreadPoolExecutor который дополнительно может планировать выполнение команд после заданной задержки или периодически. |
| Semaphore | Семафор с подсчётом. |
| StructuredTaskScopePREVIEW<T> | Предварительный просмотр. Базовый API для структурированной параллельности. |
| StructuredTaskScope.ShutdownOnFailurePREVIEW | Предварительный просмотр. |
| StructuredTaskScope.ShutdownOnSuccessPREVIEW<T> | Предварительный просмотр. |
| StructuredTaskScope.SubtaskPREVIEW<T> | Предварительный просмотр. Представляет подзадачу, созданную с помощью StructuredTaskScope.fork(Callable)PREVIEW. |
| StructuredTaskScope.Subtask.StatePREVIEW | Предварительный просмотр. Представляет состояние подзадачи. |
| StructureViolationExceptionPREVIEW | Предварительный просмотр. Выбрасывается при обнаружении нарушения структуры. |
| SubmissionPublisher<T> | A Flow.Publisher that asynchronously issues submitted (non-null) items to current subscribers until it is closed. |
| SynchronousQueue<E> | A блокирующая очередь in which each insert operation must wait for a corresponding remove operation by another thread, and vice versa. |
| ThreadFactory | An object that creates new threads on demand. |
| ThreadLocalRandom | A random number generator (with period 264) isolated to the current thread. |
| ThreadPoolExecutor | An ExecutorService that executes each submitted task using one of possibly several pooled threads, normally configured using Executors factory methods. |
| ThreadPoolExecutor.AbortPolicy | A handler for rejected tasks that throws a RejectedExecutionException. |
| ThreadPoolExecutor.CallerRunsPolicy | A handler for rejected tasks that runs the rejected task directly in the calling thread of the execute method, unless the executor has been shut down, in which case the task is discarded. |
| ThreadPoolExecutor.DiscardOldestPolicy | A handler for rejected tasks that discards the oldest unhandled request and then retries execute, unless the executor is shut down, in which case the task is discarded. |
| ThreadPoolExecutor.DiscardPolicy | A handler for rejected tasks that silently discards the rejected task. |
| TimeoutException | Исключение, выбрасываемое при истечении срока ожидания блокирующей операции. |
| TimeUnit | A TimeUnit represents time durations at a given unit of granularity and provides utility methods to convert across units, and to perform timing and delay operations in these units. |
| TransferQueue<E> | A BlockingQueue in which producers may wait for consumers to receive elements. |
© 1993, 2023, 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/21/docs/api/java.base/java/util/concurrent/package-summary.html