Spec-Zone.ru › OpenJDK 17

Пакет java.util.concurrent

package 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. В частности:
END_OF_DOCUMENT_MARKER
  • Каждое действие в потоке предшествует каждому последующему действию в этом потоке в порядке программы.
  • Разблокировка (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.
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>
Компонент, действующий как 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>
A Future, который является Runnable.
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 представляет собой продолжительность времени в заданном единице измерения и предоставляет вспомогательные методы для преобразования между единицами, а также для выполнения операций тайминга и задержки в этих единицах.
END_OF_DOCUMENT_MARKER
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

Spec-Zone.ru

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