Spec-Zone.ru › OpenJDK 8

Пакет java.util.concurrent

Утилитарные классы, обычно полезные в конкурентном программировании.

См.: Описание

Интерфейс Описание
BlockingDeque<E>

A Deque который дополнительно поддерживает блокирующие операции, которые ожидают, пока очередь не станет непустой при получении элемента, и ожидают, пока место не освободится в очереди при сохранении элемента.

BlockingQueue<E>

A Queue который дополнительно поддерживает операции, которые ожидают, пока очередь не станет непустой при получении элемента, и ожидают, пока место не освободится в очереди при сохранении элемента.

Callable<V>

Задача, возвращающая результат и которая может вызывать исключение.

CompletableFuture.AsynchronousCompletionTask

Маркерный интерфейс, определяющий асинхронные задачи, создаваемые методами async.

CompletionService<V>

Сервис, который отделяет создание новых асинхронных задач от потребления результатов завершенных задач.

CompletionStage<T>

Этап потенциально асинхронного вычисления, который выполняет действие или вычисляет значение, когда завершается другой CompletionStage.

ConcurrentMap<K,V>

A Map обеспечивающий безопасность потоков и гарантии атомарности.

ConcurrentNavigableMap<K,V>

A ConcurrentMap поддерживающий NavigableMap операции и рекурсивно для своих навигационных под-отображений.

Delayed

Интерфейс в стиле миксина для маркировки объектов, к которым нужно обратиться после заданной задержки.

Executor

Объект, выполняющий переданные Runnable задачи.

ExecutorService

A Executor который предоставляет методы для управления завершением и методы, которые могут производить Future для отслеживания прогресса одной или нескольких асинхронных задач.

ForkJoinPool.ForkJoinWorkerThreadFactory

Фабрика для создания новых ForkJoinWorkerThread.

ForkJoinPool.ManagedBlocker

Интерфейс для расширения управляемой параллельности для задач, выполняемых в ForkJoinPool.

Future<V>

A Future представляет собой результат асинхронного вычисления.

RejectedExecutionHandler

Обработчик задач, которые не могут быть выполнены ThreadPoolExecutor.

RunnableFuture<V>

A Future который является Runnable.

RunnableScheduledFuture<V>

A ScheduledFuture который является Runnable.

ScheduledExecutorService

A ExecutorService который может планировать выполнение команд после заданной задержки или периодически.

ScheduledFuture<V>

Отложенное действие, возвращающее результат, которое может быть отменено.

ThreadFactory

Объект, создающий новые потоки по требованию.

TransferQueue<E>

A BlockingQueue в котором производители могут ожидать, пока потребители получат элементы.

Класс Описание
AbstractExecutorService

Предоставляет стандартные реализации методов выполнения ExecutorService.

ArrayBlockingQueue<E>

Ограниченная очередь с блокировкой, реализованная на основе массива.

CompletableFuture<T>

Future, которая может быть явно завершена (установлено значение и статус), и может использоваться как CompletionStage, поддерживающая зависимые функции и действия, которые срабатывают при её завершении.

ConcurrentHashMap<K,V>

Хэш-таблица, поддерживающая полную конкурентность извлечения и высокую ожидаемую конкурентность для обновлений.

ConcurrentHashMap.KeySetView<K,V>

Представление ConcurrentHashMap как Set ключей, в котором добавления могут быть необязательно включены путём сопоставления с общим значением.

ConcurrentLinkedDeque<E>

Неограниченная конкурентная двойная очередь, основанная на связанных узлах.

ConcurrentLinkedQueue<E>

Неограниченная потокобезопасная очередь, основанная на связанных узлах.

ConcurrentSkipListMap<K,V>

Масштабируемая конкурентная реализация ConcurrentNavigableMap.

ConcurrentSkipListSet<E>

Масштабируемая конкурентная реализация NavigableSet, основанная на ConcurrentSkipListMap.

CopyOnWriteArrayList<E>

Потокобезопасная разновидность ArrayList, в которой все изменяющие операции (add, set, и т.д.) реализуются путем создания новой копии базового массива.

CopyOnWriteArraySet<E>

Set, которая использует внутреннюю CopyOnWriteArrayList для всех своих операций.

CountDownLatch

Сynchronous aid, позволяющий одному или нескольким потокам ожидать завершения набора операций, выполняемых в других потоках.

CountedCompleter<T>

ForkJoinTask с действием завершения, выполняемым при срабатывании, и отсутствии оставшихся ожидающих действий.

CyclicBarrier

Сynchronous aid, позволяющий набору потоков ожидать друг друга для достижения общей точки барьера.

DelayQueue<E extends Delayed>

Неограниченная очередь с блокировкой элементов, в которой элемент может быть взят только после истечения срока его ожидания.

Exchanger<V>

Точка синхронизации, в которой потоки могут объединяться и обмениваться элементами внутри пар.

ExecutorCompletionService<V>

CompletionService, использующая предоставленный Executor для выполнения задач.

Executors

Методы фабрики и вспомогательные методы для Executor, ExecutorService, ScheduledExecutorService, ThreadFactory и Callable классов, определённых в этом пакете.

ForkJoinPool

ExecutorService для запуска ForkJoinTask.

ForkJoinTask<V>

Абстрактный базовый класс для задач, выполняемых в ForkJoinPool.

ForkJoinWorkerThread

Поток, управляемый ForkJoinPool, который выполняет ForkJoinTask.

FutureTask<V>

Отменяемая асинхронная вычисление.

LinkedBlockingDeque<E>

Необязательно ограниченная двойная очередь с блокировкой, основанная на связанных узлах.

LinkedBlockingQueue<E>

Необязательно ограниченная очередь с блокировкой, основанная на связанных узлах.

LinkedTransferQueue<E>

Неограниченная TransferQueue, основанная на связанных узлах.

Phaser

Многоразовый синхронизационный барьер, похожий по функциональности на CyclicBarrier и CountDownLatch, но поддерживающий более гибкое использование.

PriorityBlockingQueue<E>

Неограниченная очередь с блокировкой, которая использует те же правила упорядочения, что и класс PriorityQueue и предоставляет операции блокирующего извлечения.

RecursiveAction

Рекурсивная безыточная ForkJoinTask.

RecursiveTask<V>

Рекурсивная результатоносящая ForkJoinTask.

ScheduledThreadPoolExecutor

ThreadPoolExecutor, который дополнительно может планировать выполнение команд после заданной задержки или периодически.

Semaphore

Счётный семафор.

SynchronousQueue<E>

Очередь с блокировкой, в которой каждая операция вставки должна ожидать соответствующей операции удаления другим потоком, и наоборот.

ThreadLocalRandom

Генератор случайных чисел, изолированный для текущего потока.

ThreadPoolExecutor

ExecutorService, который выполняет каждую переданную задачу с использованием одного из, возможно, нескольких пулированных потоков, обычно настроенных с помощью Executors методов фабрики.

ThreadPoolExecutor.AbortPolicy

Обработчик отклоненных задач, который выбрасывает RejectedExecutionException.

ThreadPoolExecutor.CallerRunsPolicy

Обработчик отклоненных задач, который выполняет отклоненную задачу напрямую в вызывающем потоке метода execute, если исполнитель не был остановлен, в противном случае задача отбрасывается.

ThreadPoolExecutor.DiscardOldestPolicy

Обработчик отклоненных задач, который отбрасывает самую старую необработанную запрос, а затем повторно пытается execute, если исполнитель не остановлен, в противном случае задача отбрасывается.

ThreadPoolExecutor.DiscardPolicy

Обработчик отклоненных задач, который молчаливо отбрасывает отклоненную задачу.

Перечисление Описание
TimeUnit

A TimeUnit представляет временные интервалы в заданных единицах измерения и предоставляет вспомогательные методы для преобразования между единицами измерения, а также для выполнения операций измерения времени и задержки в этих единицах.

Исключение Описание
BrokenBarrierException

Исключение, выбрасываемое, когда поток пытается дождаться барьера, который находится в состоянии разрыва, или который переходит в состояние разрыва, пока поток ожидает.

CancellationException

Исключение, указывающее, что результат задачи, производящей значения, например, FutureTask, не может быть получен, потому что задача была отменена.

CompletionException

Исключение, выбрасываемое при возникновении ошибки или другого исключения в процессе завершения результата или задачи.

ExecutionException

Исключение, выбрасываемое при попытке получить результат задачи, которая прервалась, выбросив исключение.

RejectedExecutionException

Исключение, выбрасываемое Executor, когда задача не может быть принята для выполнения.

TimeoutException

Исключение, выбрасываемое при истечении времени ожидания блокирующей операции.

Описание пакета 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 предоставляет фабричные методы для наиболее распространённых типов и конфигураций Executors, а также несколько утилитарных методов для их использования. Другие утилиты, основанные на 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 — очень простая, но очень распространённая утилита для блокировки до тех пор, пока заданное количество сигналов, событий или условий не выполнится.
  • A CyclicBarrier — это многосторонний контрольно-пропускной пункт, который можно перезапустить и который полезен в некоторых стилях параллельного программирования.
  • A Phaser обеспечивает более гибкую форму барьера, которая может использоваться для управления поэтапными вычислениями среди нескольких потоков.
  • A Exchanger позволяет двум потокам обмениваться объектами в точке встречи и полезен в нескольких проектах конвейера.

Конкурентные коллекции

Помимо очередей, этот пакет предоставляет реализации коллекций, предназначенные для использования в многопоточных контекстах: ConcurrentHashMap, ConcurrentSkipListMap, ConcurrentSkipListSet, CopyOnWriteArrayList и CopyOnWriteArraySet. Когда ожидается, что многие потоки будут обращаться к данной коллекции, ConcurrentHashMap обычно предпочтительнее синхронизированной HashMap, а ConcurrentSkipListMap обычно предпочтительнее синхронизированной TreeMap. CopyOnWriteArrayList предпочтительнее синхронизированной ArrayList, когда ожидаемое количество чтений и прохождений значительно превышает количество обновлений списка.

Префикс «Concurrent», используемый с некоторыми классами в этом пакете, является сокращением, указывающим на несколько различий от аналогичных классов «synchronized». Например, java.util.Hashtable и Collections.synchronizedMap(new HashMap()) синхронизированы. Но ConcurrentHashMap — «конкурентный». Конкурентная коллекция потокобезопасна, но не регулируется одним общим замком. В частности, ConcurrentHashMap безопасно допускает любое количество одновременных чтений, а также настраиваемое количество одновременных записей. Синхронизированные классы могут быть полезны, когда вам нужно предотвратить весь доступ к коллекции с помощью одного замка, за счёт более низкой масштабируемости. В других случаях, когда ожидается, что несколько потоков будут обращаться к общей коллекции, версии «concurrent» обычно предпочтительнее. А несинхронизированные коллекции предпочтительнее, когда либо коллекции не совместно используются, либо к ним можно получить доступ только при удержании других замков.

Большинство реализаций конкурентных коллекций (включая большинство очередей) также отличаются от обычных 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 все действия, последующие после любой блокировки монитора этим потоком.
  • Запись в поле volatile happens-before каждого последующего чтения этого же поля. Записи и чтения полей volatile имеют аналогичные эффекты согласованности памяти, как вход и выход из мониторов, но не подразумевают взаимную блокировку.
  • Вызов start для потока happens-before любого действия в запущенном потоке.
  • Все действия в потоке happen-before любого другого потока, успешно возвращающегося из 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 в других потоках.
Since:
1.5

© 1993, 2020, 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