Java多线程系列

多线程并发框架使用二

2018-03-19  本文已影响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();
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读