Spec-Zone .ru
спецификации, руководства, описания, API
|
V
- Тип объектов, которыми можно обменятьсяpublic class Exchanger<V> extends Object
exchange
метод, соответствует с потоком партнера, и получает объект своего партнера по возврату. Теплообменник может быть просмотрен как двунаправленная форма a 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()
в другом потоке.
Конструктор и Описание |
---|
Exchanger()
Создает новый Теплообменник.
|
Модификатор и Тип | Метод и Описание |
---|---|
V |
exchange(V x)
Ожидает другого потока, чтобы достигнуть этой точки обмена (если текущий поток не прерывается), и затем передает данный объект этому, получая его объект взамен.
|
V |
exchange(V x, long timeout, TimeUnit unit)
Ожидает другого потока, чтобы достигнуть этой точки обмена (если текущий поток не прерывается, или указанное время ожидания протекает), и затем передает данный объект этому, получая его объект взамен.
|
public V exchange(V x) throws InterruptedException
Если другой поток уже ожидает в точке обмена тогда, это возобновляется в целях планирования потоков и получает объект, который передает в текущий поток. Текущий поток сразу возвращается, получая объект, который передает к обмену тот другой поток.
Если никакой другой поток уже не ожидает при обмене тогда, текущий поток отключается в целях планирования потоков и бездействует, пока одна из двух вещей не происходит:
Если текущий поток:
InterruptedException
бросается и прерванное состояние текущего потока очищается.x
- объект обмениватьсяInterruptedException
- если текущий поток был прерван, ожидаяpublic V exchange(V x, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException
Если другой поток уже ожидает в точке обмена тогда, это возобновляется в целях планирования потоков и получает объект, который передает в текущий поток. Текущий поток сразу возвращается, получая объект, который передает к обмену тот другой поток.
Если никакой другой поток уже не ожидает при обмене тогда, текущий поток отключается в целях планирования потоков и бездействует, пока одна из трех вещей не происходит:
Если текущий поток:
InterruptedException
бросается и прерванное состояние текущего потока очищается. Если указанное время ожидания протекает тогда TimeoutException
бросается. Если время будет меньше чем или равно нулю, то метод не будет ожидать вообще.
x
- объект обмениватьсяtimeout
- максимальное время, чтобы ожидатьunit
- единица измерения времени параметра timeoutInterruptedException
- если текущий поток был прерван, ожидаяTimeoutException
- если указанное время ожидания протекает прежде, чем другой поток вводит обмен
Для дальнейшей ссылки API и документации разработчика, см.
Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.