线程同步工具类(CountDownLatch 和CyclicBarrier 简单场景使用)

一:CountDownLatch 使用

场景:

私人健身教练老王,等小丽小美换好健身衣服后才开始对她们授课

public class CountDownLatchTest {

    class Sporter implements Runnable{
        String name; //
        int arriverTime; //
        CountDownLatch countDownLatch;
        Sporter(String name,int arriverTime,CountDownLatch countDownLatch){
            this.name=name;
            this.arriverTime=arriverTime;
            this.countDownLatch=countDownLatch;
        }
        @Override
        public void run() {

            try {
                System.out.println(name+"开始换衣服");
                Thread.sleep(1000*arriverTime);
                System.out.println(name+"已经换完衣服");
                countDownLatch.countDown();

            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }


    public static void main(String[] args) {

        Executor executor= Executors.newFixedThreadPool(2);

        CountDownLatch countDownLatch=new CountDownLatch(2);
        executor.execute(new CountDownLatchTest().new Sporter("小丽",3,countDownLatch));
        executor.execute(new CountDownLatchTest().new Sporter("小美",5,countDownLatch));


        try {
            System.out.println("老王着急的等待着自己的学员");
            countDownLatch.await();

            System.out.println("老王终于开始和小丽小美愉快的进行私教训练了");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}

老王着急的等待着自己的学员
小丽开始换衣服
小美开始换衣服
小丽已经换完衣服
continus.....
小美已经换完衣服
老王终于开始和小丽小美愉快的进行私教训练了
continus.....

二:CyclicBarrier使用

应用场景:
小明家吃饭规矩,只有等到所有家人都坐到饭桌后,进行一次合照,才能吃饭 家庭成员 小明,小明爸爸 ,小明妈妈

public class CyclicBarrierTest {


        class  ArriveRunnable implements Runnable{

            String name; //
            int arriverTime; //
            CyclicBarrier cyclicBarrier;

            ArriveRunnable(String name,int arriverTime,CyclicBarrier cyclicBarrier){
                this.name=name;
                this.arriverTime=arriverTime;
                this.cyclicBarrier=cyclicBarrier;

            }
        @Override
        public void run() {
            try {
                Thread.sleep(1000*arriverTime);
                System.out.println(name+"已经落座");
                cyclicBarrier.await();
                System.out.println(name+"开始吃饭");
            } catch (Exception e) {
                e.printStackTrace();
            }


        }
    }

    public static void main(String[] args) {

            CyclicBarrier cyclicBarrier=new CyclicBarrier(3, new Runnable() {
                @Override
                public void run() {
                    try {
                        System.out.println("全家开始合影");
                        Thread.sleep(2000);
                        System.out.println("合影完成");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });

        Executor executor= Executors.newFixedThreadPool(3);
        //小明 写完作业坐下
        executor.execute(new CyclicBarrierTest().new ArriveRunnable("小明",2,cyclicBarrier));
        //小明爸爸,抽根烟才坐下
        executor.execute(new CyclicBarrierTest().new ArriveRunnable("小明爸爸",4,cyclicBarrier));
        //小明妈妈饭做完,才坐下
        executor.execute(new CyclicBarrierTest().new ArriveRunnable("小明妈妈",6,cyclicBarrier));
    }
}

小明已经落座
小明爸爸已经落座
小明妈妈已经落座
全家开始合影
合影完成
小明妈妈开始吃饭
小明开始吃饭
小明爸爸开始吃饭

CountDownLatch 和CyclicBarrier 的不同 :

CountDownLatch 一个线程等待多个线程的,CyclicBarrier 多个线程互相等待
CountDownLatch 不可以重置计数器,不能重复利用,CyclicBarrier可以

你可能感兴趣的:(线程相关)