美文网首页Java多线程系列
多线程并发框架使用二

多线程并发框架使用二

作者: 丹青水 | 来源:发表于2018-03-19 10:28 被阅读0次
    CountDownlLatch

    一个线程和多个线程,等待另外一个线程或者多个线程之后才继续执行,CountDownLatch可以理解为一个计数器在初始化时设置初始值,当一个线程需要等待某些操作先完成时,需要调用await()方法。这个方法让线程进入休眠状态直到等待的所有线程都执行完成。每调用一次countDown()方法内部计数器减1,直到计数器为0时唤醒。这个可以理解为特殊的CyclicBarrier。线程同步点比较特殊,为内部计数器值为0时开始。

    CyclicBarrier

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

    例子1(等待集合完毕,然后kill)
    public class CountDownLatchDemo {
        private CountDownLatch countDownLatch=new CountDownLatch(1);
    
        public void begin(){
            System.out.println("i am coming!");
            try {
                countDownLatch.await();
                System.out.println(" i am over");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        public  void  end(){
            System.out.println("you  will be killed!");
            countDownLatch.countDown();
        }
       
    }
    public class CountDownTest {
        public static  void main(String [] args)throws Exception{
            CountDownLatchDemo countDownLatchDemo=new CountDownLatchDemo();
            SyncThread syncThread=new SyncThread(countDownLatchDemo);
            SyncThread syncThread2=new SyncThread(countDownLatchDemo);
            syncThread.start();
            syncThread2.start();
            Thread.sleep(2000);
            countDownLatchDemo.end();
        }
    }
    
    例子二(凑够两个,然后kill两个)
    public class CyclicBarrierDemo extends Thread {
        private CyclicBarrier cyclicBarrier;
    
        public CyclicBarrierDemo(CyclicBarrier cyclicBarrier) {
            this.cyclicBarrier=cyclicBarrier;
        }
    
        @Override
        public void run() {
            try {
                Thread.sleep(1000);
                System.out.println(Thread.currentThread().getName() + " coming");
                cyclicBarrier.await();
                System.out.println(Thread.currentThread().getName() + "over");
            }catch (Exception e){
    
            }
        }
    }
    public class CyclicBarrierTest {
        public  static void main(String[] args)throws Exception{
            CyclicBarrier cyclicBarrier=new CyclicBarrier(2, new Runnable() {
                @Override
                public void run() {
                    System.out.println("double kill!!!");
                }
            }
            );
            for(int i=0;i<10;i++){
                new CyclicBarrierDemo(cyclicBarrier).start();
            }
        }
    }
    

    相关文章

      网友评论

        本文标题:多线程并发框架使用二

        本文链接:https://www.haomeiwen.com/subject/gtrrqftx.html