Пакет 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 всех действий после любой блокировки монитора этим потоком. - Запись в поле
volatilehappens-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 |
| BlockingQueue<E> | A |
| Callable<V> | A task that returns a result and may throw an exception. |
| CompletableFuture.AsynchronousCompletionTask | A marker interface identifying asynchronous tasks produced by |
| 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 |
| ConcurrentNavigableMap<K,V> | A |
| Delayed | A mix-in style interface for marking objects that should be acted upon after a given delay. |
| Executor | An object that executes submitted |
| ExecutorService | An |
| 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 |
| ForkJoinPool.ForkJoinWorkerThreadFactory | Factory for creating new |
| ForkJoinPool.ManagedBlocker | Interface for extending managed parallelism for tasks running in |
| Future<V> | A |
| RejectedExecutionHandler | A handler for tasks that cannot be executed by a |
| RunnableFuture<V> | |
| RunnableScheduledFuture<V> | A |
| ScheduledExecutorService | An |
| ScheduledFuture<V> | A delayed result-bearing action that can be cancelled. |
| ThreadFactory | An object that creates new threads on demand. |
| TransferQueue<E> | A |
| Класс | Описание |
|---|---|
| AbstractExecutorService | Предоставляет реализации по умолчанию методов выполнения |
| ArrayBlockingQueue<E> | Ограниченная блокирующая очередь, поддерживаемая массивом. |
| CompletableFuture<T> |
|
| ConcurrentHashMap<K,V> | Хеш-таблица, поддерживающая полную конкурентность для извлечений и высокую ожидаемую конкурентность для обновлений. |
| ConcurrentHashMap.KeySetView<K,V> | Вид ConcurrentHashMap как |
| ConcurrentLinkedDeque<E> | Неограниченная конкурентная очередь с двумя концами, основанная на связанных узлах. |
| ConcurrentLinkedQueue<E> | Неограниченная потокобезопасная очередь, основанная на связанных узлах. |
| ConcurrentSkipListMap<K,V> | Масштабируемая конкурентная реализация |
| ConcurrentSkipListSet<E> | Масштабируемая конкурентная реализация |
| CopyOnWriteArrayList<E> | Потокобезопасная версия |
| CopyOnWriteArraySet<E> |
|
| CountDownLatch | Средство синхронизации, которое позволяет одному или нескольким потокам ожидать завершения набора операций, выполняемых в других потоках. |
| CountedCompleter<T> |
|
| CyclicBarrier | Средство синхронизации, которое позволяет набору потоков ожидать друг друга в общей точке барьера. |
| DelayQueue<E extends Delayed> | Неограниченная блокирующая очередь элементов |
| Exchanger<V> | Точка синхронизации, в которой потоки могут объединяться и обмениваться элементами в парах. |
| ExecutorCompletionService<V> |
|
| Executors | Фабричные и вспомогательные методы для |
| Flow | Взаимосвязанные интерфейсы и статические методы для создания управляемых потоком компонентов, в которых |
| ForkJoinPool |
|
| ForkJoinTask<V> | Абстрактный базовый класс для задач, выполняемых в |
| ForkJoinWorkerThread | Поток, управляемый |
| FutureTask<V> | Отменяемая асинхронная вычисление. |
| LinkedBlockingDeque<E> | Необязательно ограниченная блокирующая очередь с двумя концами, основанная на связанных узлах. |
| LinkedBlockingQueue<E> | Необязательно ограниченная блокирующая очередь, основанная на связанных узлах. |
| LinkedTransferQueue<E> | Неограниченная |
| Phaser | Многократно используемый барьер синхронизации, похожий по функциональности на |
| PriorityBlockingQueue<E> | Неограниченная блокирующая очередь, использующая те же правила упорядочивания, что и класс |
| RecursiveAction | Рекурсивное бессодержательное |
| RecursiveTask<V> | Рекурсивная задача с возвращаемым результатом |
| ScheduledThreadPoolExecutor |
|
| Semaphore | Счётный семафор. |
| SubmissionPublisher<T> |
|
| SynchronousQueue<E> | Блокирующая очередь, в которой каждая операция вставки должна ожидать соответствующей операции удаления другим потоком, и наоборот. |
| ThreadLocalRandom | Генератор случайных чисел, изолированный для текущего потока. |
| ThreadPoolExecutor |
|
| ThreadPoolExecutor.AbortPolicy | Обработчик отклоненных задач, который выбрасывает |
| ThreadPoolExecutor.CallerRunsPolicy | Обработчик отклоненных задач, который выполняет отклоненную задачу непосредственно в вызывающем потоке метода |
| ThreadPoolExecutor.DiscardOldestPolicy | Обработчик отклоненных задач, который отбрасывает самую старую необработанную заявку и затем повторно пытается |
| ThreadPoolExecutor.DiscardPolicy | Обработчик отклоненных задач, который безмолвно отбрасывает отклоненную задачу. |
| Перечисление | Описание |
|---|---|
| TimeUnit | Единица измерения времени представляет длительность во времени в заданной единице измерения и предоставляет вспомогательные методы для преобразования между единицами измерения, а также для выполнения операций тайминга и задержек в этих единицах. |
| Исключение | Описание |
|---|---|
| BrokenBarrierException | Исключение, выбрасываемое, когда поток пытается подождать барьер, который находится в состоянии разрыва, или который переходит в состояние разрыва, пока поток ожидает. |
| CancellationException | Исключение, указывающее, что результат, возвращаемого задачей, такой как |
| CompletionException | Исключение, выбрасываемое, когда во время завершения результата или задачи возникает ошибка или другое исключение. |
| ExecutionException | Исключение, выбрасываемое при попытке получить результат задачи, прерванной сбросом исключения. |
| RejectedExecutionException | Исключение, выбрасываемое |
| 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