Класс 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, 2020, 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/11/docs/api/java.base/java/util/concurrent/Exchanger.html

Spec-Zone .ru
спецификации, руководства, описания, API