Spec-Zone.ru › OpenJDK 25

Класс 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

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

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, 2025, 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.
https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/concurrent/Exchanger.html

Spec-Zone.ru

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