|
Spec-Zone .ru
спецификации, руководства, описания, API
|
V - Тип объектов, которыми можно обменятьсяpublic class Exchanger<V> extends Object
exchange метод, соответствует с потоком партнера, и получает объект своего партнера по возврату. Теплообменник может быть просмотрен как двунаправленная форма a SynchronousQueue. Теплообменники могут быть полезными в приложениях, таких как генетические алгоритмы и конвейерно обработать проекты. Демонстрационное Использование: Вот выделения class, который использует 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 и документации разработчика, см. Java Документация SE. Та документация содержит более подробные, предназначенные разработчиком описания, с концептуальными краткими обзорами, определениями сроков, обходных решений, и рабочих примеров кода.
Авторское право © 1993, 2013, Oracle и/или его филиалы. Все права защищены.
Проект сборка-b92