java并发之同步辅助类

CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活。CyclicBarrier默认的构造方法是

CyclicBarrier(int parties),其参数表示屏障拦截的线程数量,每个线程调用await方法告诉CyclicBarrier我已经到达了屏障,然后当前线程被阻塞。

cBarrierTest {

    public static void main(String[] args) {
        ExecutorService service = Executors.newCachedThreadPool();
        final CyclicBarrier cb = new CyclicBarrier(3);//约定三个人同时到达
        for (int i = 0; i < 3; i++) {
            Runnable runnable = new Runnable() {
                public void run() {
                    try {
                        Thread.sleep((long) (Math.random() * 10000));
                        System.out.println("线程" + Thread.currentThread().getName() +
                                "即将到达集合地点1,当前已有" + (cb.getNumberWaiting() + 1) + "个已经到达," + (cb.getNumberWaiting() == 2 ? "都到齐了,继续走啊" : "正在等候"));
                        cb.await();//三个同时线程的时候才往下走

                        Thread.sleep((long) (Math.random() * 10000));
                        System.out.println("线程" + Thread.currentThread().getName() +
                                "即将到达集合地点2,当前已有" + (cb.getNumberWaiting() + 1) + "个已经到达," + (cb.getNumberWaiting() == 2 ? "都到齐了,继续走啊" : "正在等候"));
                        cb.await();
                        Thread.sleep((long) (Math.random() * 10000));
                        System.out.println("线程" + Thread.currentThread().getName() +
                                "即将到达集合地点3,当前已有" + (cb.getNumberWaiting() + 1) + "个已经到达," + (cb.getNumberWaiting() == 2 ? "都到齐了,继续走啊" : "正在等候"));
                        cb.await();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            };
            service.execute(runnable);
        }
        service.shutdown();
    }
}

原文地址:https://www.cnblogs.com/tinya/p/8452808.html

时间: 2024-11-04 20:23:28

java并发之同步辅助类的相关文章

java并发之同步辅助类Phaser

Phaser含义: 更加复杂和强大的同步辅助类.它允许并发执行多阶段任务.当我们有并发任务并且需要分解成几步执行时,(CyclicBarrier是分成两步),就可以选择使用Phaser.Phaser类机制是在每一步结束的位置对线程进行同步,当所有的线程都完成了这一步,才允许执行下一步.跟其他同步工具一样,必须对Phaser类中参与同步操作的任务数进行初始化,不同的是,可以动态的增加或者减少任务数. 函数:arriveAndAwaitAdvance():类似于CyclicBarrier的await

java并发之同步辅助类CountDownLatch

CountDownLatch 含义: CountDownLatch可以理解为一个计数器在初始化时设置初始值,当一个线程需要等待某些操作先完成时,需要调用await()方法.这个方法让线程进入休眠状态直到等待的所有线程都执行完成.每调用一次countDown()方法内部计数器减1,直到计数器为0时唤醒.这个可以理解为特殊的CyclicBarrier.线程同步点比较特殊,为内部计数器值为0时开始. 方法:核心方法两个:countDown()和await()countDown():使CountDown

java并发之同步辅助类CyclicBarrier

CyclicBarrier含义: 栅栏允许两个或者多个线程在某个集合点同步.当一个线程到达集合点时,它将调用await()方法等待其它的线程.线程调用await()方法后,CyclicBarrier将阻塞这个线程并将它置入休眠状态等待其它线程的到来.等最后一个线程调用await()方法时,CyclicBarrier将唤醒所有等待的线程然后这些线程将继续执行.CyclicBarrier可以传入另一个Runnable对象作为初始化参数.当所有的线程都到达集合点后,CyclicBarrier类将Run

java并发之同步辅助类semaphore

semaphore(sem??f?r)含义: 信号量就是可以声明多把锁(包括一把锁:此时为互斥信号量).举个例子:一个房间如果只能容纳5个人,多出来的人必须在门外面等着.如何去做呢?一个解决办法就是:房间外面挂着五把钥匙,每进去一个人就取走一把钥匙,没有钥匙的不能进入该房间而是在外面等待.每出来一个人就把钥匙放回原处以方便别人再次进入. 常用方法acquire():获取信号量,信号量内部计数器减1release():释放信号量,信号量内部计数器加1tryAcquire():这个方法试图获取信号量

Java并发编程-同步辅助类之Exchanger

Exchanger是自jdk1.5起开始提供的工具套件,一般用于两个工作线程之间交换数据.在本文中我将采取由浅入深的方式来介绍分析这个工具类.首先我们来看看官方的api文档中的叙述: A synchronization point at which threads can pair and swap elements within pairs. Each thread presents some object on entry to the exchange method, matches wi

JAVA线程同步辅助类CyclicBarrier循环屏障

CyclicBarrier是一个同步辅助类,主要作用是让一组线程互相等待,知道都到达一个公共障点,在一起走.在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用.因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier. CyclicBarrier 支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次.若在继续所有参与线程之前更新共享状态,此屏

【Java多线程】CountDownLatch同步辅助类

CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 主要方法: public CountDownLatch(int count);  //构造方法参数, 指定了计数的次数 public void countDown();        //调用此方法,则计数减一 public void await();        //调用此方法会一直阻塞当前线程,直到计时器的值为0 代码: import java.util.concurren

JAVA线程同步辅助类CountDownLatch

一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 用给定的计数 初始化 CountDownLatch.由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞.之后,会释放所有等待的线程,await 的所有后续调用都将立即返回.这种现象只出现一次——计数无法被重置.如果需要重置计数,请考虑使用 CyclicBarrier. CountDownLatch 是一个通用同步工具,它有很多用途.将计数 1 初始化的 Count

【Java多线程】CyclicBarrier同步辅助类

CyclicBarrier是java.util.concurrent包下的一个同步辅助类,类似于CountDownLatch,也是一个同步计数器. 与CountDownLatch不同的区别是:    CountDownLatch的await()方法阻塞的原因是等待调用一定次数的countDown()方法, 可以在同一线程完成; CyclicBarrier的await()方法阻塞的原因是等待一定数量的线程调用await()方法, 必须在不同线程调用 所以,概括来说: CountDownLatch是