Spec-Zone .ru
спецификации, руководства, описания, API
|
public class CountDownLatch extends Object
A CountDownLatch
инициализируется с данным количеством. await
блок методов до текущего количества достигает нуля из-за вызовов countDown()
метод, после которого все потоки ожидания выпускаются и любые последующие вызовы await
возвратитесь сразу. Это - явление с одним выстрелом - количество не может быть сброшено. Если Вы нуждаетесь в версии, которая сбрасывает количество, рассмотрите использование a CyclicBarrier
.
A CountDownLatch
универсальный инструмент синхронизации и может использоваться во многих целях. A CountDownLatch
инициализированный с количеством каждый служит, поскольку простое вкл\выкл фиксируется, или логический элемент: весь вызов потоков await
ожидайте в логическом элементе, пока он не открывается вызовом потока countDown()
. A CountDownLatch
инициализированный к N может использоваться, чтобы заставить один поток ожидать, пока N потоки не завершили некоторое действие, или некоторое действие было завершено времена N.
Полезное свойство a CountDownLatch
это, это не требует что вызов потоков countDown
ожидайте количества, чтобы достигнуть нуля перед продолжением, это просто препятствует тому, чтобы любой поток продолжился мимо await
пока все потоки не могли передать.
Демонстрационное использование: Вот пара классов, в которых группа рабочих потоков используют два фиксатора обратного отсчета:
class Driver { // ...
void main() throws InterruptedException {
CountDownLatch startSignal = new CountDownLatch(1);
CountDownLatch doneSignal = new CountDownLatch(N);
for (int i = 0; i < N; ++i) // create and start threads
new Thread(new Worker(startSignal, doneSignal)).start();
doSomethingElse(); // don't let run yet
startSignal.countDown(); // let all threads proceed
doSomethingElse();
doneSignal.await(); // wait for all to finish
}
}
class Worker implements Runnable {
private final CountDownLatch startSignal;
private final CountDownLatch doneSignal;
Worker(CountDownLatch startSignal, CountDownLatch doneSignal) {
this.startSignal = startSignal;
this.doneSignal = doneSignal;
}
public void run() {
try {
startSignal.await();
doWork();
doneSignal.countDown();
} catch (InterruptedException ex) {} // return;
}
void doWork() { ... }
}
Другое типичное использование должно было бы разделить проблему на части N, описать, каждый расстается с Выполнимым, которое выполняет ту часть и считает в обратном порядке на фиксаторе, и очереди весь Runnables Исполнителю. Когда все подразделения будут полны, поток координирования будет в состоянии пройти, ждут. (Когда потоки должны неоднократно считать в обратном порядке таким образом, вместо этого используйте a CyclicBarrier
.)
class Driver2 { // ...
void main() throws InterruptedException {
CountDownLatch doneSignal = new CountDownLatch(N);
Executor e = ...
for (int i = 0; i < N; ++i) // create and start threads
e.execute(new WorkerRunnable(doneSignal, i));
doneSignal.await(); // wait for all to finish
}
}
class WorkerRunnable implements Runnable {
private final CountDownLatch doneSignal;
private final int i;
WorkerRunnable(CountDownLatch doneSignal, int i) {
this.doneSignal = doneSignal;
this.i = i;
}
public void run() {
try {
doWork(i);
doneSignal.countDown();
} catch (InterruptedException ex) {} // return;
}
void doWork() { ... }
}
Эффекты непротиворечивости памяти: Пока количество не достигает нуля, действий в потоке до вызова countDown()
произойдите - перед действиями после успешного возврата из соответствия await()
в другом потоке.
Конструктор и Описание |
---|
CountDownLatch(int count)
Конструкции a
CountDownLatch инициализированный с данным количеством. |
Модификатор и Тип | Метод и Описание |
---|---|
void |
await()
Заставляет текущий поток ожидать, пока фиксатор не считал в обратном порядке, чтобы обнулить, если поток не прерывается.
|
boolean |
await(long timeout, TimeUnit unit)
Заставляет текущий поток ожидать, пока фиксатор не считал в обратном порядке, чтобы обнулить, если поток не прерывается, или указанное время ожидания протекает.
|
void |
countDown()
Постепенно уменьшает количество фиксатора, выпуская все потоки ожидания, если количество достигает нуля.
|
long |
getCount()
Возвращает текущее количество.
|
Строка |
toString()
Возвращает строку, идентифицирующую этот фиксатор, так же как его состояние.
|
public CountDownLatch(int count)
CountDownLatch
инициализированный с данным количеством.count
- число раз countDown()
должен быть вызван прежде, чем потоки могут пройти await()
IllegalArgumentException
- если count
отрицательноpublic void await() throws InterruptedException
Если текущее количество является нулем тогда, этот метод сразу возвращается.
Если текущее количество больше чем нуль тогда, текущий поток становится отключенным в целях планирования потоков и бездействует, пока одна из двух вещей не происходит:
countDown()
метод; или Если текущий поток:
InterruptedException
бросается и прерванное состояние текущего потока очищается.InterruptedException
- если текущий поток прерывается, ожидаяpublic boolean await(long timeout, TimeUnit unit) throws InterruptedException
Если текущее количество является нулем тогда, этот метод сразу возвращается со значением true
.
Если текущее количество больше чем нуль тогда, текущий поток становится отключенным в целях планирования потоков и бездействует, пока одна из трех вещей не происходит:
countDown()
метод; или Если количество достигает нуля тогда возвраты метода со значением true
.
Если текущий поток:
InterruptedException
бросается и прерванное состояние текущего потока очищается. Если указанное время ожидания протекает тогда значение false
возвращается. Если время будет меньше чем или равно нулю, то метод не будет ожидать вообще.
timeout
- максимальное время, чтобы ожидатьunit
- единица измерения времени timeout
параметрtrue
если количество достигнутый нуль и false
если время ожидания, законченное перед количеством достигнутый нульInterruptedException
- если текущий поток прерывается, ожидаяpublic void countDown()
Если текущее количество больше чем нуль тогда, это постепенно уменьшается. Если новое количество является нулем тогда, все потоки ожидания повторно включаются в целях планирования потоков.
Если текущее количество равняется нулю тогда, ничто не происходит.
public long getCount()
Этот метод обычно используется для отладки и тестирования целей.
public String toString()
"Count ="
сопровождаемый текущим количеством.
Для дальнейшей ссылки API и документации разработчика, см. Java Документация SE. Та документация содержит более подробные, предназначенные разработчиком описания, с концептуальными краткими обзорами, определениями сроков, обходных решений, и рабочих примеров кода.
Авторское право © 1993, 2013, Oracle и/или его филиалы. Все права защищены.
Проект сборка-b92