Класс 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 |
exchange |
Ожидает прибытия другого потока в эту точку обмена (если только текущий поток не был прерван и не истекло указанное время ожидания), после чего передаёт ему указанный объект и получает его объект в ответ. |
Подробное описание конструкторов
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://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/util/concurrent/Exchanger.html