Spec-Zone.ru › OpenJDK 24

Класс Exchanger

java.lang.Object
java.util.concurrent.Exchanger
Параметры типа:
V - Тип объектов, которые могут быть обменены
public class Exchanger<V> extends Object
Точка синхронизации, в которой потоки могут объединяться и обмениваться элементами в парах. Каждый поток представляет некоторый объект при входе в метод exchange, подбирается с партнёрским потоком и получает объект партнёра при возврате. Обменник можно рассматривать как двунаправленную форму 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, 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://download.java.net/java/early_access/jdk24/docs/api/java.base/java/util/concurrent/Exchanger.html

Spec-Zone.ru

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