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