Класс 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>();
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 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()
Создаёт новый 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.