Spec-Zone.ru › OpenJDK 17

Класс Exchanger<V>

java.lang.Object
java.util.concurrent.Exchanger<V>
Тип параметров:
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, 2021, 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/17/docs/api/java.base/java/util/concurrent/Exchanger.html

Spec-Zone.ru

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