Пакет 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позволяет двум потокам обмениваться объектами в точке встречи и полезен в нескольких вариантах организации конвейеров.
Коллекции для параллельной работы
Помимо очередей, этот пакет предоставляет реализации 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 - гарантируется, что они ровно один раз обойдут элементы, существовавшие на момент создания, и они могут (но это не гарантируется) отражать любые изменения, произошедшие после создания.
Свойства согласованности памяти
Глава 17 Спецификации языка Java определяет отношение happens-before для операций с памятью, таких как чтение и запись общих переменных. Результаты записи, выполненной одним потоком, гарантированно видны при чтении другим потоком только в том случае, если операция записи happens-before операции чтения. Конструкцииsynchronized и volatile, а также методы Thread.start() и Thread.join() могут образовывать отношения happens-before. В частности: - Каждое действие в потоке happens-before любого следующего за ним действия в этом потоке согласно порядку программы.
- Снятие блокировки (выход из блока или метода
synchronized) монитора happens-before каждой последующей блокировки (входа в блок или методsynchronized) того же монитора. Поскольку отношение happens-before транзитивно, все действия потока до снятия блокировки happen-before всем действиям любого потока после блокировки этого монитора. - Запись в поле
volatilehappens-before каждого последующего чтения того же поля. Запись и чтение полейvolatileимеют эффекты согласованности памяти, аналогичные входу в мониторы и выходу из них, но не предполагают блокировку для взаимного исключения. - Вызов
startдля потока happens-before любого действия в запущенном потоке. - Все действия в потоке happen-before успешного возврата любого другого потока из вызова
joinдля этого потока.
java.util.concurrent и его подпакетах распространяют эти гарантии на синхронизацию более высокого уровня. В частности: - Действия в потоке до помещения объекта в любую параллельную коллекцию happen-before действий, выполняемых после доступа к этому элементу или его удаления из коллекции другим потоком.
- Действия в потоке до отправки
RunnableвExecutorhappen-before начала его выполнения. Аналогично дляCallables, отправленного вExecutorService. - Действия, выполненные асинхронным вычислением, представленным
Future, happen-before действий, выполняемых после получения результата черезFuture.get()в другом потоке. - Действия до вызова методов синхронизатора, «освобождающих» его, таких как
Lock.unlock,Semaphore.releaseиCountDownLatch.countDown, happen-before действий после успешного вызова метода «захвата», такого какLock.lock,Semaphore.acquire,Condition.awaitиCountDownLatch.await, для того же объекта синхронизатора в другом потоке. - Для каждой пары потоков, успешно обменивающихся объектами через
Exchanger, действия до вызоваexchange()в каждом потоке happen-before действий после соответствующего вызоваexchange()в другом потоке. - Действия до вызова
CyclicBarrier.awaitиPhaser.awaitAdvance(а также их вариантов) happen-before действий, выполненных действием барьера, а действия, выполненные действием барьера, happen-before действий после успешного возврата из соответствующего вызоваawaitв других потоках.
- См. Спецификацию языка Java:
- 17.4.5 Порядок Happens-before
- Начиная с версии:
- 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, |
Компонент, выступающий одновременно в роли подписчика и издателя. |
| 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 | Счётный семафор. |
|
StructuredTaskScopeПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ<T, |
Предварительная версия. API для структурированной конкурентности. |
| StructuredTaskScope.ConfigurationПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ | Предварительная версия. Представляет конфигурацию для StructuredTaskScope. |
| StructuredTaskScope.FailedExceptionПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ | Предварительная версия. Исключение, выбрасываемое методом StructuredTaskScope.join()ПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ, если результатом является исключение, а не значение. |
|
StructuredTaskScope.JoinerПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ<T, |
Предварительная версия. Объект, используемый с StructuredTaskScopeПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ для обработки завершения подзадач и получения результата для владельца области, ожидающего в методе joinПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ завершения подзадач. |
| StructuredTaskScope.SubtaskПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ<T> | Предварительная версия. Представляет подзадачу, запущенную методом StructuredTaskScope.fork(Callable)ПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ или StructuredTaskScope.fork(Runnable)ПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ. |
| StructuredTaskScope.Subtask.StateПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ | Предварительная версия. Представляет состояние подзадачи. |
| StructuredTaskScope.TimeoutExceptionПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ | Предварительная версия. Исключение, выбрасываемое методом StructuredTaskScope.join()ПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ, если область создана с тайм-аутом и он истёк до начала или во время ожидания в join. |
| StructureViolationExceptionПРЕДВАРИТЕЛЬНАЯ ВЕРСИЯ | Предварительная версия. Выбрасывается при обнаружении нарушения структуры. |
| 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, в которой производители могут ожидать получения элементов потребителями. |
© 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://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/concurrent/package-summary.html