CountDownLatch和cyclicBarrier 的使用

CountDownLatch

这个类使用起来比较简单.使用场景就是 你需要很多线程执行结束之后才执行最后的代码,那用这个就对了. 这个类底层是用aqs来实现的.

这类主要使用的方法

count.await();
count.countDown();

里面的API很少

CountDownLatch和cyclicBarrier 的使用

结束线程await()

1.countDown

2.被阻塞的线程interrupt()

  private static CountDownLatch count = new CountDownLatch(1);
    public static void main(String[] args) throws InterruptedException {
        Thread t =Thread.currentThread();

        new Thread(()->{
            try {
                Thread.sleep(2000);
                t.interrupt();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }).start();

        System.out.println("阻塞....");
        count.await();
        System.out.println("=====");

    }
}
View Code

 就是比如你有几个线程需要跑批你的任务你可以在countDown初始化的时候把线程数方进入

每一个线程结束的时候调用coutDown -1 等所有线程都执行结束之后.可以进行汇总

cyclicBarrier

cyclicBarrier 和countDownLatch有点相似,不过他们是不同的.

countDownLatch 是初始化一个线程数 做一个计数器的功能.相当于一个裁判,线程相当于一个一个选手.当所有选手都结束的时候,才会总的进行分数.或者其他的运算

cyclicBarrier 也有自己的初始值,只不过他的模式,是让线程直接互相等待,打一个比方,比如去聚会,需要10个人才能吃饭,但是现在来了9个人,大家都在等这第10个人来了.才开始一起吃饭.

就是有个await()方法当所有线程调用都到达这里的时候才会一起去执行下面的代码.

    public static void main(String[] args) throws InterruptedException {
        CyclicBarrier cyclicBarrier = new CyclicBarrier(2);

        new Thread(()->{

            try {
                TimeUnit.SECONDS.sleep(10);
                System.out.println("t1 finied ");
                cyclicBarrier.await();
                System.out.println("t1 结束..await'");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }

        }).start();
        new Thread(()->{

            try {
                TimeUnit.SECONDS.sleep(5);
                System.out.println("t2 finished ");
                cyclicBarrier.await();
                System.out.println("t2 结束..await'");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }

        }).start();

        Thread.currentThread().join();
    }

t2 finished
t1 finied
t1 结束..await'
t2 结束..await'

回调的方式

 public static void main(String[] args) throws InterruptedException, BrokenBarrierException {
        CyclicBarrier cyclicBarrier = new CyclicBarrier(2,()->{
            System.out.println("所有都结束了");
        });

        new Thread(()->{

            try {
                TimeUnit.SECONDS.sleep(10);
                System.out.println("t1 finied ");
                cyclicBarrier.await();
                System.out.println("t1 结束..await'");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }

        }).start();
        new Thread(()->{

            try {
                TimeUnit.SECONDS.sleep(5);
                System.out.println("t2 finished ");
                cyclicBarrier.await();
                System.out.println("t2 结束..await'");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }

        }).start();

    }
View Code