Пакет 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 предоставляет фабричные методы для самых распространённых типов и конфигураций Executor, а также несколько утилитных методов для их использования. Другие утилиты, основанные на 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, когда ожидаемое число чтений и проходов намного превышает число обновлений в списке. Префикс «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> | Двусторонняя очередь, которая дополнительно поддерживает блокирующие операции, ожидая, пока очередь не станет непустой при получении элемента и ожидая освобождения места в очереди при сохранении элемента. |
| BlockingQueue<E> | Очередь, которая дополнительно поддерживает операции, которые ожидают, пока очередь не станет непустой при получении элемента, и ожидают освобождения места в очереди при сохранении элемента. |
| BrokenBarrierException | Исключение, выбрасываемое, когда поток пытается дождаться барьера, который находится в состоянии разрыва или переходит в состояние разрыва, пока поток ожидает. |
| Callable<V> | Задача, возвращающая результат и которая может выбросить исключение. |
| CancellationException | Исключение, указывающее, что результат задачи, производящей значение, например, FutureTask, не может быть получен, потому что задача была отменена. |
| CompletableFuture<T> | A Future, который может быть явно завершён (установка его значения и состояния) и может использоваться как CompletionStage, поддерживающий зависимые функции и действия, которые срабатывают при его завершении. |
| CompletableFuture.AsynchronousCompletionTask | Маркерный интерфейс, определяющий асинхронные задачи, созданные методами async. |
| CompletionException | Исключение, выбрасываемое при возникновении ошибки или другого исключения во время завершения результата или задачи. |
| CompletionService<V> | Сервис, который разъединяет создание новых асинхронных задач от потребления результатов завершенных задач. |
| CompletionStage<T> | Этап возможной асинхронной вычисления, который выполняет действие или вычисляет значение при завершении другого CompletionStage. |
|
ConcurrentHashMap<K, |
Хэш-таблица, поддерживающая полную конкурентность извлечений и высокую ожидаемую конкурентность для обновлений. |
|
ConcurrentHashMap.KeySetView<K, |
Представление ConcurrentHashMap как Set ключей, в котором добавления могут быть необязательно включены, сопоставляя их со значением по умолчанию. |
| ConcurrentLinkedDeque<E> | Неограниченная конкурентная двусторонняя очередь на основе связанных узлов. |
| ConcurrentLinkedQueue<E> | Неограниченная потокобезопасная очередь на основе связанных узлов. |
|
ConcurrentMap<K, |
A Map обеспечивающая потокобезопасность и гарантирующую атомарность. |
|
ConcurrentNavigableMap<K, |
A ConcurrentMap поддерживающий операции NavigableMap, и рекурсивно для его навигационных под-отображений. |
|
ConcurrentSkipListMap<K, |
Масштабируемая конкурентная реализация ConcurrentNavigableMap. |
| ConcurrentSkipListSet<E> | Масштабируемая конкурентная реализация NavigableSet, основанная на ConcurrentSkipListMap. |
| CopyOnWriteArrayList<E> | Потокобезопасная разновидность ArrayList, в которой все изменяющие операции (add, set и т. д.) реализуются путем создания новой копии базового массива. |
| CopyOnWriteArraySet<E> | A Set использующая внутренний CopyOnWriteArrayList для всех своих операций. |
| CountDownLatch | Средство синхронизации, которое позволяет одному или нескольким потокам ожидать завершения набора операций, выполняемых в других потоках. |
| CountedCompleter<T> | A ForkJoinTask с действием завершения, выполняемым, когда оно активизировано, и нет оставшихся ожидающих действий. |
| CyclicBarrier | Средство синхронизации, которое позволяет набору потоков ожидать друг друга, чтобы достичь общей точки барьера. |
| Delayed | Интерфейс смешанного стиля для маркировки объектов, на которые необходимо действовать после заданной задержки. |
| DelayQueue<E extends Delayed> | Неограниченная очередь с блокировкой элементов Delayed, в которой элемент обычно становится доступным для удаления, когда истекает его задержка. |
| Exchanger<V> | Точка синхронизации, в которой потоки могут объединяться и обмениваться элементами в парах. |
| ExecutionException | Исключение, выбрасываемое при попытке получить результат задачи, которая была прервана путём выброса исключения. |
| Executor | Объект, выполняющий переданные Runnable задачи. |
| ExecutorCompletionService<V> | A CompletionService использующий предоставленный Executor для выполнения задач. |
| 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 | Объект ExecutorService для выполнения ForkJoinTask. |
| ForkJoinPool.ForkJoinWorkerThreadFactory | Фабрика для создания новых ForkJoinWorkerThread. |
| ForkJoinPool.ManagedBlocker | Интерфейс для расширения управляемого параллелизма для задач, выполняемых в ForkJoinPool. |
| ForkJoinTask<V> | Абстрактный базовый класс для задач, выполняемых в ForkJoinPool. |
| ForkJoinWorkerThread | Поток, управляемый ForkJoinPool, который выполняет ForkJoinTask. |
| Future<V> | 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> | ScheduledFuture, который является Runnable. |
| ScheduledExecutorService | ExecutorService, который может планировать выполнение команд через заданный интервал времени или периодически. |
| ScheduledFuture<V> | Отложенное действие с результатом, которое может быть отменено. |
| ScheduledThreadPoolExecutor | 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 очередь с блокировкой в которой каждая операция вставки должна ожидать соответствующей операции удаления другим потоком, и наоборот. |
| ThreadFactory | Объект, создающий новые потоки по требованию. |
| ThreadLocalRandom | Генератор случайных чисел (с периодом 264), изолированный для текущего потока. |
| ThreadPoolExecutor | An ExecutorService that executes each submitted task using one of possibly several pooled threads, normally configured using Executors factory methods. |
| ThreadPoolExecutor.AbortPolicy | Обработчик отклоненных задач, который выбрасывает RejectedExecutionException. |
| ThreadPoolExecutor.CallerRunsPolicy | Обработчик отклоненных задач, который выполняет отклоненную задачу непосредственно в вызывающем потоке метода execute, если пул потоков не был остановлен, в противном случае задача отбрасывается. |
| ThreadPoolExecutor.DiscardOldestPolicy | Обработчик отклоненных задач, который отбрасывает самую старую неокрепшую заявку и затем повторно пытается execute, если пул потоков не остановлен, в противном случае задача отбрасывается. |
| ThreadPoolExecutor.DiscardPolicy | Обработчик отклоненных задач, который молча отбрасывает отклоненную задачу. |
| TimeoutException | Исключение, выбрасываемое, когда блокирующая операция истекает. |
| TimeUnit | A TimeUnit представляет длительности времени в заданных единицах измерения и предоставляет вспомогательные методы для преобразования между единицами, а также для выполнения операций тайминга и задержки в этих единицах. |
| TransferQueue<E> | A BlockingQueue в котором производители могут ждать, пока потребители не получат элементы. |
© 1993, 2025, 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://download.java.net/java/early_access/jdk24/docs/api/java.base/java/util/concurrent/package-summary.html