Spec-Zone.ru › OpenJDK 21

Класс Exchanger<V>

java.lang.Object
java.util.concurrent.Exchanger<V>
Параметры типа:
V - тип объектов, которые могут быть обменены
public class Exchanger<V> extends Object
Точка синхронизации, в которой потоки могут образовывать пары и обмениваться элементами в рамках этих пар. Каждый поток предоставляет некоторый объект при входе в метод exchange, находит соответствующий поток-партнер и получает объект партнера по возвращении. Обменник (Exchanger) можно рассматривать как двунаправленную форму SynchronousQueue. Обменники могут быть полезны в приложениях, таких как генетические алгоритмы и конвейерные разработки.

Пример использования: Вот ключевые моменты класса, использующего Exchanger для обмена буферами между потоками, чтобы поток, заполняющий буфер, получал свежеопустошённый, когда ему это нужно, передавая заполненный буфер потоку, его освобождающему.

 
 class FillAndEmpty {
   Exchanger<DataBuffer> exchanger = new Exchanger<>();
   DataBuffer initialEmptyBuffer = ...; // a made-up type
   DataBuffer initialFullBuffer = ...;

   class FillingLoop implements Runnable {
     public void run() {
       DataBuffer currentBuffer = initialEmptyBuffer;
       try {
         while (currentBuffer != null) {
           addToBuffer(currentBuffer);
           if (currentBuffer.isFull())
             currentBuffer = exchanger.exchange(currentBuffer);
         }
       } catch (InterruptedException ex) { ... handle ...}
     }
   }

   class EmptyingLoop implements Runnable {
     public void run() {
       DataBuffer currentBuffer = initialFullBuffer;
       try {
         while (currentBuffer != null) {
           takeFromBuffer(currentBuffer);
           if (currentBuffer.isEmpty())
             currentBuffer = exchanger.exchange(currentBuffer);
         }
       } catch (InterruptedException ex) { ... handle ...}
     }
   }

   void start() {
     new Thread(new FillingLoop()).start();
     new Thread(new EmptyingLoop()).start();
   }
 }

Эффекты согласованности памяти: Для каждой пары потоков, успешно обменявшихся объектами через Exchanger, действия, предшествующие exchange() в каждом потоке, предшествуют действиям, последующим за возвращением из соответствующего exchange() в другом потоке.

С тех пор:
1.5

Краткое описание конструкторов

Конструктор Описание
Exchanger()
Создает новый обменник.

Краткое описание методов

Модификатор и тип Метод Описание
V exchange(V x)
Ожидает прибытия другого потока в эту точку обмена (если текущий поток не прерван), затем передает ему заданный объект, получая его объект взамен.
V exchange(V x, long timeout, TimeUnit unit)
Ожидает прибытия другого потока в эту точку обмена (если текущий поток не прерван и заданное время ожидания не истекло), затем передает ему заданный объект, получая его объект взамен.

Методы, объявленные в классе java.lang.Object

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

Подробное описание конструкторов

Exchanger

public Exchanger()
Создает новый обменник.

Подробное описание методов

exchange

public V exchange(V x) throws InterruptedException
Ожидает прибытия другого потока в эту точку обмена (если текущий поток не прерван), затем передает ему заданный объект, получая его объект взамен.

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

Если ни один другой поток не ожидает в точке обмена, текущий поток отключается для целей планирования потоков и находится в спящем состоянии, пока не произойдёт одно из двух:

  • Другой поток входит в обмен; или
  • Другой поток прерывает текущий поток.

Если текущий поток:

  • имеет установленный статус прерывания при входе в этот метод; или
  • прерывается во время ожидания обмена,
то выбрасывается исключение InterruptedException, а статус прерывания текущего потока сбрасывается.
Параметры:
x - объект для обмена
Возвращает:
объект, предоставленный другим потоком
Исключения:
InterruptedException - если текущий поток был прерван во время ожидания

exchange

public V exchange(V x, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException
Ожидает прибытия другого потока в эту точку обмена (если текущий поток не прерван и заданное время ожидания не истекло), затем передает ему заданный объект, получая его объект взамен.

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

Если ни один другой поток не ожидает в точке обмена, текущий поток отключается для целей планирования потоков и находится в спящем состоянии, пока не произойдёт одно из трёх:

  • Другой поток входит в обмен; или
  • Другой поток прерывает текущий поток; или
  • Заданное время ожидания истекает.

Если текущий поток:

  • имеет установленный статус прерывания при входе в этот метод; или
  • прерывается во время ожидания обмена,
то выбрасывается исключение InterruptedException, а статус прерывания текущего потока сбрасывается.

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

Параметры:
x - объект для обмена
timeout - максимальное время ожидания
unit - единица измерения времени для аргумента timeout
Возвращает:
объект, предоставленный другим потоком
Исключения:
InterruptedException - если текущий поток был прерван во время ожидания
TimeoutException - если заданное время ожидания истекло до того, как другой поток вошёл в обмен

© 1993, 2023, 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/21/docs/api/java.base/java/util/concurrent/Exchanger.html

Spec-Zone.ru

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