Класс Exchanger
- Параметры типа:
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 |
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://download.java.net/java/early_access/jdk24/docs/api/java.base/java/util/concurrent/Exchanger.html