Spec-Zone .ru
спецификации, руководства, описания, API
|
public class CyclicBarrier extends Object
CyclicBarrier поддерживает дополнительное Runnable
команда, которая выполняется однажды на точку барьера после последнего потока в стороне, прибывает, но прежде, чем любые потоки будут выпущены. Это действие барьера полезно для обновления общего состояния прежде, чем любая из сторон будет продолжаться.
Демонстрационное использование: Вот пример использования барьера в параллельном проекте разложения:
class Solver {
final int N;
final float[][] data;
final CyclicBarrier barrier;
class Worker implements Runnable {
int myRow;
Worker(int row) { myRow = row; }
public void run() {
while (!done()) {
processRow(myRow);
try {
barrier.await();
} catch (InterruptedException ex) {
return;
} catch (BrokenBarrierException ex) {
return;
}
}
}
}
public Solver(float[][] matrix) {
data = matrix;
N = matrix.length;
barrier = new CyclicBarrier(N,
new Runnable() {
public void run() {
mergeRows(...);
}
});
for (int i = 0; i < N; ++i)
new Thread(new Worker(i)).start();
waitUntilDone();
}
}
Здесь, каждый рабочий поток обрабатывает строку матрицы, тогда ожидает в барьере, пока все строки не были обработаны. Когда все строки обрабатываются предоставленный Runnable
действие барьера выполняется и объединяет строки. Если слияние решит, что решение было найдено тогда, то done() возвратит true, и каждый рабочий завершит. Если действие барьера не полагается на стороны, приостанавливаемые, когда оно выполняется, то любой из потоков в стороне мог выполнить то действие, когда оно выпускается. Облегчить это, каждый вызов await()
возвращается прибытие индексируют того потока в барьере. Можно тогда выбрать, какой поток должен выполнить действие барьера, например:
if (barrier.await() == 0) {
// log the completion of this iteration
}
CyclicBarrier использует категорическую модель поломки для отказавших попыток синхронизации: Если поток листы, на которые барьер указывает преждевременно из-за прерывания, отказа, или тайм-аута, все другие потоки, ожидающие в той точке барьера, также уедет неправильно через BrokenBarrierException
(или InterruptedException
если они также были прерваны в приблизительно то же самое время).
Эффекты непротиворечивости памяти: Действия в потоке до вызова await()
произойдите - перед действиями, которые являются частью действия барьера, которые поочередно происходят - перед действиями после успешного возврата из соответствия await()
в других потоках.
CountDownLatch
Конструктор и Описание |
---|
CyclicBarrier(int parties)
Создает новый CyclicBarrier, который сместится, когда данное число сторон (потоки) будет ожидать на него, и не выполняет предопределенное действие, когда барьер смещается.
|
CyclicBarrier(int parties, Runnable barrierAction)
Создает новый CyclicBarrier, который сместится, когда данное число сторон (потоки) будет ожидать на него, и который выполнит данное действие барьера, когда барьер будет смещен, выполняется последним потоком, вводящим барьер.
|
Модификатор и Тип | Метод и Описание |
---|---|
int |
await()
Ожидает, пока все стороны не вызвали await на этот барьер.
|
int |
await(long timeout, TimeUnit unit)
Ожидает, пока все стороны не вызвали await на этот барьер, или указанное время ожидания протекает.
|
int |
getNumberWaiting()
Возвращает число сторон, в настоящий момент ожидая в барьере.
|
int |
getParties()
Возвращает число сторон, требуемых смещаться этот барьер.
|
boolean |
isBroken()
Запросы, если этот барьер находится в нарушенном состоянии.
|
void |
reset()
Сбрасывает барьер для его начального состояния.
|
public CyclicBarrier(int parties, Runnable barrierAction)
parties
- число потоков, которые должны вызвать await()
прежде, чем барьер смещаетсяbarrierAction
- команда, чтобы выполниться, когда барьер смещается, или null
если нет никакого действияIllegalArgumentException
- если parties
меньше чем 1public CyclicBarrier(int parties)
parties
- число потоков, которые должны вызвать await()
прежде, чем барьер смещаетсяIllegalArgumentException
- если parties
меньше чем 1public int getParties()
public int await() throws InterruptedException, BrokenBarrierException
Если текущий поток не является последним, чтобы прибыть тогда, он отключается в целях планирования потоков и бездействует, пока одна из следующих вещей не происходит:
reset()
на этом барьере. Если текущий поток:
InterruptedException
бросается и прерванное состояние текущего потока очищается. Если барьер reset()
в то время как любой поток ожидает, или если барьер повреждается, когда await вызывается, или в то время как любой поток ожидает, тогда BrokenBarrierException
бросается.
Если какой-либо поток будет прерван, ожидая, то все другие потоки ожидания бросят BrokenBarrierException
и барьер помещается в нарушенное состояние.
Если текущий поток является последним потоком, который прибудет, и ненулевое действие барьера было предоставлено в конструкторе, то текущий поток выполняет действие прежде, чем позволить другим потокам продолжаться. Если исключение происходит во время действия барьера тогда, что исключение будет распространено в текущем потоке, и барьер помещается в нарушенное состояние.
getParties()
- 1 указывает, что первое, чтобы прибыть и обнулить указывает на последнее, чтобы прибытьInterruptedException
- если текущий поток был прерван, ожидаяBrokenBarrierException
- если другой поток был прерван или синхронизирован, в то время как текущий поток ожидал, или барьер был сброшен, или барьер был поврежден когда await
был вызван, или действие барьера, (если есть) отказавшее должный исключение.public int await(long timeout, TimeUnit unit) throws InterruptedException, BrokenBarrierException, TimeoutException
Если текущий поток не является последним, чтобы прибыть тогда, он отключается в целях планирования потоков и бездействует, пока одна из следующих вещей не происходит:
reset()
на этом барьере. Если текущий поток:
InterruptedException
бросается и прерванное состояние текущего потока очищается. Если указанное время ожидания протекает тогда TimeoutException
бросается. Если время будет меньше чем или равно нулю, то метод не будет ожидать вообще.
Если барьер reset()
в то время как любой поток ожидает, или если барьер повреждается, когда await вызывается, или в то время как любой поток ожидает, тогда BrokenBarrierException
бросается.
Если какой-либо поток будет прерван, ожидая, то все другие потоки ожидания бросят BrokenBarrierException
и барьер помещается в нарушенное состояние.
Если текущий поток является последним потоком, который прибудет, и ненулевое действие барьера было предоставлено в конструкторе, то текущий поток выполняет действие прежде, чем позволить другим потокам продолжаться. Если исключение происходит во время действия барьера тогда, что исключение будет распространено в текущем потоке, и барьер помещается в нарушенное состояние.
timeout
- время, чтобы ожидать барьераunit
- единица измерения времени параметра тайм-аутаgetParties()
- 1 указывает, что первое, чтобы прибыть и обнулить указывает на последнее, чтобы прибытьInterruptedException
- если текущий поток был прерван, ожидаяTimeoutException
- если указанный тайм-аут протекаетBrokenBarrierException
- если другой поток был прерван или синхронизирован, в то время как текущий поток ожидал, или барьер был сброшен, или барьер был поврежден когда await
был вызван, или действие барьера, (если есть) отказавшее должный исключениеpublic boolean isBroken()
true
если одна или более сторон убегали из этого барьера из-за прерывания или тайм-аута начиная с конструкции или последнего сброса, или действия барьера, отказавшего из-за исключения; false
иначе.public void reset()
BrokenBarrierException
. Отметьте, что сбросы после поломки произошли по другим причинам, может быть усложнен, чтобы выполнить; потоки должны ресинхронизировать некоторым другим способом, и выбрать, чтобы выполнить сброс. Может быть предпочтительно вместо этого создать новый барьер для последующего использования.public int getNumberWaiting()
await()
Для дальнейшей ссылки API и документации разработчика, см. Java Документация SE. Та документация содержит более подробные, предназначенные разработчиком описания, с концептуальными краткими обзорами, определениями сроков, обходных решений, и рабочих примеров кода.
Авторское право © 1993, 2013, Oracle и/или его филиалы. Все права защищены.
Проект сборка-b92