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;
Runnable barrierAction =
new Runnable() { public void run() { mergeRows(...); }};
barrier = new CyclicBarrier(N, barrierAction);
List<Thread> threads = new ArrayList<Thread>(N);
for (int i = 0; i < N; i++) {
Thread thread = new Thread(new Worker(i));
threads.add(thread);
thread.start();
}
// wait until done
for (Thread thread : threads)
thread.join();
}
}
这里,每个工作者线程处理矩阵的一行然后等待直到所有行的障碍已被处理。当所有行处理提供
Runnable
阻挡动作执行和合并行。如果合并确定已找到解决方案并
done()
将返回
true
每个工人将终止。
如果障碍行动不依赖于当它被执行时被暂停,那么当它被释放的时候,在一方的任何线程中的任何一个线程可以执行该动作。为推动这项工作,每次调用await()
返回屏障,到达指数线。然后,您可以选择要执行阻挡动作的哪个线程,例如:
if (barrier.await() == 0) {
// log the completion of this iteration
}
的CyclicBarrier
采用全或无破损模型同步失败的尝试:如果一个线程离开障碍点因为过早地中断,失败,或者超时,所有其他线程在障碍点等也将离开异常通过BrokenBarrierException
(或InterruptedException
他们是否也在同一时间中断)。
内存一致性效果:在调用await()
happen-before行动的屏障作用部分前一个线程的行为,这反过来又发生过行动从其他线程中相应的await()
成功归来。
CountDownLatch
Constructor and Description |
---|
CyclicBarrier(int parties)
创建一个新的
CyclicBarrier 将旅行当给定数量的政党(线程)正等待它,并且不执行预定的动作时的障碍绊倒。
|
CyclicBarrier(int parties, Runnable barrierAction)
创建一个新的
CyclicBarrier 将旅行当给定数量的政党(线程)正等待它,和它将执行给定的屏障作用时的障碍绊倒,由最后一个线程进入障碍的表现。
|
Modifier and Type | Method and Description |
---|---|
int |
await()
等到所有的
parties援引
await 这个屏障。
|
int |
await(long timeout, TimeUnit unit)
等到所有的
parties援引
await 这个障碍,或指定的等待时间的流逝。
|
int |
getNumberWaiting()
返回当前正在等待的障碍物的数量。
|
int |
getParties()
返回访问此障碍所需的方数。
|
boolean |
isBroken()
查询,如果这个障碍是在一个破碎的状态。
|
void |
reset()
重置为其初始状态的屏障。
|
public CyclicBarrier(int parties, Runnable barrierAction)
CyclicBarrier
将旅行当给定数量的政党(线程)正等待它,和它将执行给定的屏障作用时的障碍绊倒,由最后一个线程进入障碍的表现。
parties
-线程必须调用
await()
前障跳闸次数
barrierAction
-命令执行时的障碍绊倒,或
null
如果没有行动
IllegalArgumentException
-如果
parties
小于1
public CyclicBarrier(int parties)
CyclicBarrier
将旅行当给定数量的政党(线程)正等待它,并且不执行预定的动作时的障碍绊倒。
parties
-线程必须调用
await()
前障跳闸次数
IllegalArgumentException
-如果
parties
小于1
public int getParties()
public int await() throws InterruptedException, BrokenBarrierException
await
这个屏障。
如果当前线程不是最后一个到达,那么它被禁用的线程调度的目的,并处于休眠状态,直到下面的事情发生:
reset()
这个屏障。如果当前线程:
InterruptedException
投入和当前线程的中断状态被清除。
如果障碍物reset()
在任何线程正在等待,或者阻挡is broken await
时调用,或在任何线程在等待,然后BrokenBarrierException
抛出。
如果任何线程interrupted而等待,那么其他所有等待的线程会把BrokenBarrierException
和障碍放在破碎的状态。
如果当前线程是最后一个到达的线程,并且在构造函数中提供了一个非空的屏障作用,那么当前的线程在允许其他线程继续之前运行这个动作。如果在屏障作用期间发生异常,则该异常将在当前线程中传播,并将其放置在断态。
getParties() - 1
表示第一个来,最后一个到零表示
InterruptedException
-如果当前线程被中断等待
BrokenBarrierException
如果另一个线程被中断或超时而当前线程在等待,或屏障被复位,或屏障被打破时,
await
叫,或屏障作用(如果有的话)因异常而失败
public int await(long timeout, TimeUnit unit) throws InterruptedException, BrokenBarrierException, TimeoutException
await
这个障碍,或指定的等待时间的流逝。
如果当前线程不是最后一个到达,那么它被禁用的线程调度的目的,并处于休眠状态,直到下面的事情发生:
reset()
这个屏障。如果当前线程:
InterruptedException
投入和当前线程的中断状态被清除。
如果指定的等待时间的流逝,然后TimeoutException
抛出。如果时间小于或等于零,该方法将不会等待在所有。
如果障碍物reset()
在任何线程正在等待,或者阻挡is broken await
时调用,或在任何线程在等待,然后BrokenBarrierException
抛出。
如果任何线程interrupted而等待,那么其他所有等待的线程会把BrokenBarrierException
和障碍放在破碎的状态。
如果当前线程是最后一个到达的线程,并且在构造函数中提供了一个非空的屏障作用,那么当前的线程在允许其他线程继续之前运行这个动作。如果在屏障作用期间发生异常,则该异常将在当前线程中传播,并将其放置在断态。
timeout
-时间等障碍
unit
- timeout参数的时间单位
getParties() - 1
表示第一个来,最后一个到零表示
InterruptedException
-如果当前线程被中断等待
TimeoutException
-如果指定的超时时间流逝。在这种情况下,障碍将被打破。
BrokenBarrierException
如果另一个线程被中断或超时而当前线程在等待,或屏障被复位,或屏障被打破时,
await
叫,或屏障作用(如果有的话)因异常而失败
public boolean isBroken()
true
如果一个或多个政党打破了这个障碍由于中断或暂停施工或自上次复位,或屏障作用因例外;
false
否则。
public void reset()
BrokenBarrierException
。复位后其他原因发生破损记录都可以进行复杂的;线程需要在一些其他的方式重新同步,并选择一个进行复位。它可能是最好的,而不是创建一个新的障碍,为后续使用。
public int getNumberWaiting()
await()
Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2014, Oracle and/or its affiliates. All rights reserved.