Spec-Zone.ru › OpenJDK 27

Пакет java.util.concurrent

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

Исполнители

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

Реализации. Классы ThreadPoolExecutor и ScheduledThreadPoolExecutor предоставляют гибкие пулы потоков с настраиваемыми параметрами. Класс Executors предоставляет фабричные методы для наиболее распространённых видов и конфигураций Executor, а также несколько вспомогательных методов для работы с ними. К другим утилитам на основе Executors относятся конкретный класс FutureTask, предоставляющий общую расширяемую реализацию Future, и 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», используемый в названиях некоторых классов этого пакета, служит сокращённым обозначением ряда отличий от аналогичных «синхронизированных» классов. Например, java.util.Hashtable и Collections.synchronizedMap(new HashMap()) синхронизированы. А вот ConcurrentHashMap является «параллельным». Параллельная коллекция потокобезопасна, но не управляется одной блокировкой взаимоисключения. В частности, ConcurrentHashMap безопасно допускает любое количество параллельных операций чтения, а также большое количество параллельных операций записи. «Синхронизированные» классы могут быть полезны, когда необходимо предотвратить любой доступ к коллекции, используя одну блокировку, ценой снижения масштабируемости. В других случаях, когда ожидается, что к общей коллекции будут обращаться несколько потоков, обычно предпочтительны «параллельные» версии. Несинхронизированные коллекции предпочтительны, когда коллекции не являются общими или доступны только при удержании других блокировок.

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

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

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

Глава 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
Пакет Описание
java.util
Содержит инфраструктуру коллекций, некоторые классы поддержки интернационализации, загрузчик служб, свойства, генерацию случайных чисел, классы для разбора и сканирования строк, кодирование и декодирование Base64, битовый массив и несколько различных служебных классов.
java.util.concurrent.atomic
Небольшой набор классов, поддерживающих потокобезопасное программирование без блокировок с отдельными переменными.
java.util.concurrent.locks
Интерфейсы и классы, предоставляющие инфраструктуру для блокировок и ожидания условий, отличную от встроенной синхронизации и мониторов.
Класс Описание
AbstractExecutorService
Предоставляет реализации по умолчанию для методов ExecutorService, кроме Executor.execute(Runnable).
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,V>
Хеш-таблица, обеспечивающая полную конкурентность операций чтения и высокую ожидаемую конкурентность операций обновления.
ConcurrentHashMap.KeySetView<K,V>
Представление ConcurrentHashMap в виде Set ключей, в котором добавление элементов можно включить, сопоставляя их с общим значением.
ConcurrentLinkedDeque<E>
Неограниченная конкурентная дека на основе связанных узлов.
ConcurrentLinkedQueue<E>
Неограниченная потокобезопасная очередь на основе связанных узлов.
ConcurrentMap<K,V>
Map, обеспечивающая гарантии потокобезопасности и атомарности.
ConcurrentNavigableMap<K,V>
ConcurrentMap, поддерживающая операции NavigableMap, в том числе рекурсивно для её навигационных подотображений.
ConcurrentSkipListMap<K,V>
Масштабируемая реализация конкурентной 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
Executor, предоставляющий методы для управления завершением работы и методы, способные создавать Future для отслеживания хода выполнения одной или нескольких асинхронных задач.
Flow
Взаимосвязанные интерфейсы и статические методы для создания компонентов с управляемым потоком, в которых Publishers создают элементы, потребляемые одним или несколькими Subscribers, каждый из которых управляется Subscription.
Flow.Processor<T,R>
Компонент, выступающий одновременно в роли подписчика и издателя.
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>
Future, которую можно выполнить (Runnable).
RunnableScheduledFuture<V>
ScheduledFuture, которую можно выполнить (Runnable).
ScheduledExecutorService
ExecutorService, способный планировать выполнение команд после заданной задержки или периодически.
ScheduledFuture<V>
Отложенное действие, возвращающее результат и допускающее отмену.
ScheduledThreadPoolExecutor
ThreadPoolExecutor, который также может планировать выполнение команд после заданной задержки или периодически.
Semaphore
Счётный семафор.
StructuredTaskScopePREVIEW<T, R, R_X extends Throwable>
Предварительная версия.
API для структурированной конкурентности.
StructuredTaskScope.CancelledByTimeoutExceptionPREVIEW
Предварительная версия.
Исключение — причина, по которой join()PREVIEW выбрасывает исключение: область действия была отменена из-за превышения времени ожидания.
StructuredTaskScope.ConfigurationPREVIEW
Предварительная версия.
Представляет конфигурацию для StructuredTaskScope.
StructuredTaskScope.JoinerPREVIEW<T, R, R_X extends Throwable>
Предварительная версия.
Объект, используемый с StructuredTaskScopePREVIEW для получения результата метода join()PREVIEW этой области действия.
StructuredTaskScope.SubtaskPREVIEW<T>
Предварительная версия.
Представляет подзадачу, запущенную в StructuredTaskScopePREVIEW с помощью fork(Callable)PREVIEW или fork(Runnable)PREVIEW.
StructuredTaskScope.Subtask.StatePREVIEW
Предварительная версия.
Представляет состояние SubtaskPREVIEW.
StructureViolationExceptionPREVIEW
Предварительная версия.
Выбрасывается при обнаружении нарушения структуры.
SubmissionPublisher<T>
Flow.Publisher, асинхронно передающий отправленные элементы (не равные null) текущим подписчикам до своего закрытия.
SynchronousQueue<E>
Блокирующая очередь, в которой каждая операция вставки должна ожидать соответствующую операцию удаления, выполняемую другим потоком, и наоборот.
ThreadFactory
Объект, создающий новые потоки по запросу.
ThreadLocalRandom
Генератор случайных чисел (с периодом 264), изолированный в пределах текущего потока.
ThreadPoolExecutor
ExecutorService, выполняющий каждую отправленную задачу с помощью одного из нескольких потоков пула; обычно настраивается с использованием фабричных методов Executors.
ThreadPoolExecutor.AbortPolicy
Обработчик отклонённых задач, выбрасывающий RejectedExecutionException.
ThreadPoolExecutor.CallerRunsPolicy
Обработчик отклонённых задач, выполняющий отклонённую задачу непосредственно в потоке, вызвавшем метод execute, если только исполнитель не завершил работу; в этом случае задача отбрасывается.
ThreadPoolExecutor.DiscardOldestPolicy
Обработчик отклонённых задач, отбрасывающий самый старый необработанный запрос и затем повторяющий execute, если только исполнитель не завершил работу; в этом случае задача отбрасывается.
ThreadPoolExecutor.DiscardPolicy
Обработчик отклонённых задач, незаметно отбрасывающий отклонённую задачу.
TimeoutException
Исключение, возникающее при превышении времени ожидания блокирующей операции.
TimeUnit
TimeUnit представляет длительность времени в единицах заданной точности и предоставляет служебные методы для преобразования между единицами, а также для выполнения операций измерения времени и задержки в этих единицах.
TransferQueue<E>
BlockingQueue, в которой производители могут ждать, пока потребители не получат элементы.

Сообщить об ошибке или предложить улучшение
Дополнительную справочную информацию по API и документацию для разработчиков см. в разделе Документация Java SE, содержащем более подробные описания для разработчиков, обзоры концепций, определения терминов, обходные решения и примеры работающего кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или её аффилированных лиц в США и других странах.
Авторское право © 1993, 2026, Oracle и/или её аффилированные лица, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 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.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API