Пакет java.util.concurrent
java.util.concurrent.locks и java.util.concurrent.atomic. Исполнители (Executors)
Интерфейсы.Executor — это простой стандартизированный интерфейс для определения пользовательских многопоточных подсистем, включая пулы потоков, асинхронное ввод-вывод и лёгкие фреймворки задач. В зависимости от конкретного класса Executor, задачи могут выполняться в новом созданном потоке, в существующем потоке выполнения задач или в потоке, вызывающем execute, и могут выполняться последовательно или параллельно. ExecutorService предоставляет более полный фреймворк асинхронного выполнения задач. ExecutorService управляет очередью и планированием задач и позволяет контролировать завершение. Подинтерфейс ScheduledExecutorService и связанные интерфейсы добавляют поддержку выполнения задач с задержкой и периодически. ExecutorServices предоставляют методы для организации асинхронного выполнения любой функции, выраженной как Callable, аналог Runnable с возвращаемым результатом. Future возвращает результаты функции, позволяет определить, завершено ли выполнение, и предоставляет способ отмены выполнения. RunnableFuture является Future, который обладает методом run, который при выполнении устанавливает свои результаты. Реализации. Классы ThreadPoolExecutor и ScheduledThreadPoolExecutor предоставляют настраиваемые, гибкие пулы потоков. Класс Executors предоставляет фабричные методы для наиболее распространённых типов и конфигураций Executors, а также несколько утилитарных методов для их использования. Другие утилиты, основанные на Executors, включают конкретный класс FutureTask, предоставляющий общую расширяемую реализацию Futures, и ExecutorCompletionService, который помогает в координации обработки групп асинхронных задач.
Класс ForkJoinPool предоставляет Executor, в первую очередь предназначенный для обработки экземпляров ForkJoinTask и его подклассов. Эти классы используют планировщик с кражей работы, который достигает высокой производительности для задач, соответствующих ограничениям, которые часто имеют место при вычислениях с интенсивной параллельной обработкой.
Очереди (Queues)
КлассConcurrentLinkedQueue предоставляет эффективную масштабируемую потокобезопасную, неблокирующую очередь FIFO. Класс ConcurrentLinkedDeque аналогичен, но дополнительно поддерживает интерфейс Deque. Пять реализаций в java.util.concurrent поддерживают расширенный интерфейс BlockingQueue, который определяет блокирующие версии put и take: LinkedBlockingQueue, ArrayBlockingQueue, SynchronousQueue, PriorityBlockingQueue и DelayQueue. Различные классы охватывают наиболее распространённые контексты использования для задач производителя-потребителя, обмена сообщениями, параллельного выполнения задач и связанных с ними многопоточных конструкций.
Расширенный интерфейс TransferQueue и реализация LinkedTransferQueue вводят синхронный transfer метод (наряду со связанными функциями), в котором производитель может выборочно заблокироваться, ожидая своего потребителя.
Интерфейс BlockingDeque расширяет BlockingQueue для поддержки операций FIFO и LIFO (стековой). Класс LinkedBlockingDeque предоставляет реализацию.
Временные интервалы (Timing)
КлассTimeUnit предоставляет несколько гранул (включая наносекунды) для указания и управления операциями с тайм-аутом. Большинство классов в пакете содержат операции на основе тайм-аутов в дополнение к неопределённым ожиданиям. Во всех случаях, когда используются тайм-ауты, тайм-аут указывает минимальное время ожидания метода перед указанием о том, что он истек. Реализации прилагают «максимальные усилия» для обнаружения тайм-аутов как можно скорее после их возникновения. Однако может пройти неопределённое время между обнаружением тайм-аута и фактическим повторным выполнением потока после этого тайм-аута. Все методы, принимающие параметры тайм-аута, рассматривают значения, меньшие или равные нулю, как означающие, что не нужно ждать вообще. Чтобы ждать «бесконечно», можно использовать значение Long.MAX_VALUE. Синхронизаторы (Synchronizers)
Пять классов помогают общим специальным синхронизационным идиомам.-
Semaphore— классический инструмент параллельности. -
CountDownLatch— очень простая, но очень распространённая утилита для блокировки до тех пор, пока определённое количество сигналов, событий или условий не будут выполнены. -
CyclicBarrier— это перезапускаемая многосторонняя точка синхронизации, полезная в некоторых стилях параллельного программирования. -
Phaserпредоставляет более гибкую форму барьера, которая может использоваться для управления фазами вычислений среди нескольких потоков. -
Exchangerпозволяет двум потокам обмениваться объектами в точке встречи и полезен в нескольких конструкциях конвейеров.
Конкурентные коллекции (Concurrent Collections)
Помимо очередей, этот пакет предоставляет реализации Collection, предназначенные для использования в многопоточных контекстах:ConcurrentHashMap, ConcurrentSkipListMap, ConcurrentSkipListSet, CopyOnWriteArrayList и CopyOnWriteArraySet. Когда ожидается, что несколько потоков будут обращаться к заданной коллекции, ConcurrentHashMap обычно предпочтительнее синхронизированной HashMap, а ConcurrentSkipListMap обычно предпочтительнее синхронизированной TreeMap. CopyOnWriteArrayList предпочтительнее синхронизированного ArrayList когда ожидаемое количество чтений и проходов значительно превышает количество обновлений списка. Префикс «Concurrent», используемый с некоторыми классами в этом пакете, является сокращением, указывающим на несколько отличий от аналогичных «синхронизированных» классов. Например, 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. В частности:- Каждое действие в потоке предшествует каждому последующему действию в этом потоке в порядке программы.
- Разблокировка (
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> | Deque, дополнительно поддерживающая блокирующие операции, ожидающие, пока очередь не станет непустой при извлечении элемента, и ожидающие освобождения места в очереди при добавлении элемента. |
| BlockingQueue<E> | Queue, дополнительно поддерживающая операции, ожидающие, пока очередь не станет непустой при извлечении элемента, и ожидающие освобождения места в очереди при добавлении элемента. |
| BrokenBarrierException | Исключение, выбрасываемое, когда поток пытается дождаться барьера, находящегося в поврежденном состоянии, или который переходит в поврежденное состояние, в то время как поток ожидает. |
| Callable<V> | Задача, возвращающая результат и которая может выбросить исключение. |
| CancellationException | Исключение, указывающее, что результат задачи, производящей значение, например, FutureTask, не может быть получен, потому что задача была отменена. |
| CompletableFuture<T> | Future, которая может быть явно завершена (установка значения и состояния) и может использоваться как CompletionStage, поддерживая зависимые функции и действия, которые запускаются при её завершении. |
| CompletableFuture.AsynchronousCompletionTask | Интерфейс-маркер, определяющий асинхронные задачи, созданные методами async. |
| CompletionException | Исключение, которое выбрасывается, когда возникает ошибка или другое исключение в процессе завершения результата или задачи. |
| CompletionService<V> | Сервис, который отделяет создание новых асинхронных задач от потребления результатов завершенных задач. |
| CompletionStage<T> | Этап возможного асинхронного вычисления, который выполняет действие или вычисляет значение, когда завершается другой CompletionStage. |
|
ConcurrentHashMap<K, |
Хеш-таблица, поддерживающая полную конкуретность извлечений и высокую ожидаемую конкуретность для обновлений. |
|
ConcurrentHashMap.KeySetView<K, |
Представление ConcurrentHashMap в виде Set ключей, в котором добавления могут быть необязательно включены путем сопоставления со значением общего типа. |
| ConcurrentLinkedDeque<E> | Неограниченная конкурентная очередь с двусторонним обходом, основанная на связанных узлах. |
| ConcurrentLinkedQueue<E> | Неограниченная потокобезопасная очередь, основанная на связанных узлах. |
|
ConcurrentMap<K, |
Map с гарантированной потоковой безопасностью и атомарностью. |
|
ConcurrentNavigableMap<K, |
ConcurrentMap, поддерживающая NavigableMap операции и рекурсивно для её навигационных под-отображений. |
|
ConcurrentSkipListMap<K, |
Масштабируемая конкурентная реализация ConcurrentNavigableMap. |
| ConcurrentSkipListSet<E> | Масштабируемая конкурентная реализация NavigableSet, основанная на ConcurrentSkipListMap. |
| CopyOnWriteArrayList<E> | Потокобезопасная разновидность ArrayList, в которой все изменяющие операции (add, set, и т. д.) реализуются путем создания новой копии базового массива. |
| CopyOnWriteArraySet<E> | Set, которая использует внутренний CopyOnWriteArrayList для всех своих операций. |
| CountDownLatch | Средство синхронизации, которое позволяет одному или нескольким потокам ждать завершения набора операций, выполняемых в других потоках. |
| CountedCompleter<T> | ForkJoinTask с действием завершения, выполняемым при запуске и отсутствии оставшихся ожидающих действий. |
| CyclicBarrier | Средство синхронизации, которое позволяет набору потоков ожидать друг друга до достижения общей точки барьера. |
| Delayed | Интерфейс для маркировки объектов, которые должны быть обработаны после заданной задержки. |
| DelayQueue<E extends Delayed> | Неограниченная блокирующая очередь элементов Delayed, в которой элемент может быть взят только после истечения его задержки. |
| Exchanger<V> | Точка синхронизации, в которой потоки могут объединяться и обмениваться элементами внутри пар. |
| ExecutionException | Исключение, выбрасываемое при попытке получить результат задачи, которая прервана из-за выброшенного исключения. |
| Executor | Объект, выполняющий предоставленные задачи Runnable. |
| ExecutorCompletionService<V> | CompletionService, использующая предоставленный Executor для выполнения задач. |
| Executors | Фабричные и служебные методы для Executor, ExecutorService, ScheduledExecutorService, ThreadFactory и Callable классов, определённых в этом пакете. |
| ExecutorService |
| Flow | Взаимосвязанные интерфейсы и статические методы для создания компонентов, управляемых потоком, в которых Publishers производят элементы, потребляемые одним или несколькими Subscribers, каждый из которых управляется Subscription. |
|
Flow.Processor<T, |
Компонент, действующий как Subscriber и Publisher. |
| 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 представляет собой результат асинхронного вычисления. |
| 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 | Счетный семафор. |
| SubmissionPublisher<T> | A Flow.Publisher который асинхронно выдает представленные (не нулевые) элементы текущим подписчикам до закрытия. |
| SynchronousQueue<E> | A очередь с блокировкой в которой каждая операция вставки должна ожидать соответствующей операции удаления другим потоком, и наоборот. |
| ThreadFactory | Объект, создающий новые потоки по требованию. |
| ThreadLocalRandom | Генератор случайных чисел (с периодом 264), изолированный для текущего потока. |
| ThreadPoolExecutor | A ExecutorService что выполняет каждую поданную задачу, используя один из, возможно, нескольких пулированных потоков, обычно настроенных с помощью Executors фабричных методов. |
| ThreadPoolExecutor.AbortPolicy | Обработчик отклоненных задач, выбрасывающий RejectedExecutionException. |
| ThreadPoolExecutor.CallerRunsPolicy | Обработчик отклоненных задач, который выполняет отклоненную задачу непосредственно в вызывающем потоке метода execute, если пул не был остановлен, в противном случае задача отбрасывается. |
| ThreadPoolExecutor.DiscardOldestPolicy | Обработчик отклоненных задач, отбрасывающий самую старую необработанную заявку, а затем повторяет попытку execute, если пул не был остановлен, в противном случае задача отбрасывается. |
| ThreadPoolExecutor.DiscardPolicy | Обработчик отклоненных задач, который тихо отбрасывает отклоненную задачу. |
| TimeoutException | Исключение, выбрасываемое при истечении срока ожидания блокирующей операции. |
| TimeUnit | A TimeUnit представляет собой продолжительность времени в заданном единице измерения и предоставляет вспомогательные методы для преобразования между единицами, а также для выполнения операций тайминга и задержки в этих единицах. |
| TransferQueue<E> | A BlockingQueue in which producers may wait for consumers to receive elements. |
© 1993, 2021, 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/17/docs/api/java.base/java/util/concurrent/package-summary.html