您好,登录后才能下订单哦!
CyclicBarrier是Java并发包中的一个同步工具类,它允许一组线程互相等待,直到所有线程都到达某个屏障点(barrier point)后再继续执行。CyclicBarrier的名字中的“Cyclic”意味着它可以重复使用,即当所有线程都到达屏障点后,屏障会被重置,可以再次使用。
CyclicBarrier提供了两个构造方法:
public CyclicBarrier(int parties)
public CyclicBarrier(int parties, Runnable barrierAction)
parties
:表示需要等待的线程数量。barrierAction
:当所有线程都到达屏障点时,会执行的一个Runnable任务。await()
:线程调用此方法表示已经到达屏障点,并等待其他线程到达。当所有线程都到达屏障点后,屏障会打开,所有线程继续执行。await(long timeout, TimeUnit unit)
:与await()
类似,但增加了超时机制。如果在指定时间内没有所有线程都到达屏障点,则会抛出TimeoutException
。getNumberWaiting()
:返回当前在屏障处等待的线程数量。getParties()
:返回需要等待的线程数量。isBroken()
:判断屏障是否处于“破损”状态。如果某个线程在等待时被中断或超时,屏障会被标记为“破损”。以下是一个简单的示例,展示了如何使用CyclicBarrier来同步多个线程:
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierExample {
public static void main(String[] args) {
int numThreads = 3;
CyclicBarrier barrier = new CyclicBarrier(numThreads, () -> {
System.out.println("所有线程已到达屏障点,继续执行");
});
for (int i = 0; i < numThreads; i++) {
new Thread(new Task(barrier), "Thread-" + i).start();
}
}
static class Task implements Runnable {
private CyclicBarrier barrier;
public Task(CyclicBarrier barrier) {
this.barrier = barrier;
}
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName() + " 正在执行任务");
Thread.sleep((long) (Math.random() * 2000));
System.out.println(Thread.currentThread().getName() + " 到达屏障点");
barrier.await();
System.out.println(Thread.currentThread().getName() + " 继续执行");
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
}
}
}
在这个示例中,我们创建了3个线程,每个线程在执行完任务后会调用barrier.await()
方法,等待其他线程到达屏障点。当所有线程都到达屏障点后,屏障会打开,所有线程继续执行。
CyclicBarrier适用于需要多个线程协同工作的场景,例如:
CyclicBarrier和CountDownLatch都是用于线程同步的工具类,但它们有一些区别:
barrierAction
),而CountDownLatch没有这个功能。CyclicBarrier是Java并发编程中一个非常有用的工具类,它可以帮助我们实现多个线程之间的同步。通过CyclicBarrier,我们可以让一组线程在某个屏障点等待,直到所有线程都到达后再继续执行。CyclicBarrier的可重用性使其在需要多次同步的场景中非常有用。在实际开发中,我们可以根据具体需求选择合适的同步工具类,以提高程序的并发性能和可靠性。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。