Spec-Zone.ru › OpenJDK 27

Класс Exchanger<V>

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

Пример использования: Ниже приведены основные фрагменты класса, который использует 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()
Создаёт новый Exchanger.

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

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

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

clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Модификатор и тип Метод Описание
protected Object clone()
Создаёт и возвращает копию этого объекта.
boolean equals(Object obj)
Показывает, равен ли другой объект этому объекту.
protected void finalize()
Устарело, будет удалено: этот элемент API планируется удалить в будущей версии.
Финализация объявлена устаревшей и будет удалена в одном из будущих выпусков.
final Class<?> getClass()
Возвращает класс времени выполнения этого Object.
int hashCode()
Возвращает значение хеш-кода этого объекта.
final void notify()
Пробуждает один поток, ожидающий на мониторе этого объекта.
final void notifyAll()
Пробуждает все потоки, ожидающие на мониторе этого объекта.
String toString()
Возвращает строковое представление объекта.
final void wait()
Заставляет текущий поток ожидать пробуждения, обычно вследствие уведомления или прерывания.
final void wait(long timeoutMillis)
Заставляет текущий поток ожидать пробуждения, обычно вследствие уведомления или прерывания, либо истечения определённого времени.
final void wait(long timeoutMillis, int nanos)
Заставляет текущий поток ожидать пробуждения, обычно вследствие уведомления или прерывания, либо истечения определённого времени.

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

Exchanger

public Exchanger()
Создаёт новый 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 — если указанное время ожидания истекает до того, как другой поток участвует в обмене

Сообщить об ошибке или предложить улучшение
Дополнительные справочные материалы по API и документацию для разработчиков см. в документации Java SE, содержащей более подробные описания для разработчиков, обзоры концепций, определения терминов, обходные решения и рабочие примеры кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или её аффилированных лиц в США и других странах.
Авторское право © 1993, 2026, Oracle и/или её аффилированные лица, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 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.

Spec-Zone.ru

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