让线程同时进行,闭锁

一个或多个线程,等待其他线程执行完之后再执行

比如启动web框架,主线程会等待所有初始化线程执行完之后再继续执行

注意:1,计数器和线程数并不是一对一的关系。计数器可以远大于线程数

2,当工作线程减完(做完countDown任务)之后,可以继续运行做其他的任务,不一定会关闭或者退出

应用场景

1,时间上的并行性,让指定的线程可以同时开放

2,操作excel,多个子线程同时处理不同的表单,等处理完,主线程汇总

3,启动应用程序,进行初始化工作,其他的初始化任务全做完了再让主线程进行下一步操作

........

实例代码

/**
 *类说明:演示CountDownLatch用法,
 * 共5个初始化子线程,6个闭锁扣除点,扣除完毕后,主线程和业务线程才能继续执行
 */
public class UseCountDownLatch {

    static CountDownLatch latch = new CountDownLatch(6);

    /*初始化线程*/
    private static class InitThread implements Runnable{

        public void run() {
            System.out.println("Thread_"+Thread.currentThread().getId()
                    +" ready init work......");
            latch.countDown();
            for(int i =0;i<2;i++) {
                System.out.println("Thread_"+Thread.currentThread().getId()
                        +" ........continue do its work");
            }
        }
    }

    /*业务线程等待latch的计数器为0完成*/
    private static class BusiThread implements Runnable{

        public void run() {
            try {
                latch.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            for(int i =0;i<3;i++) {
                System.out.println("BusiThread_"+Thread.currentThread().getId()
                        +" do business-----");
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        new Thread(new Runnable() {
            public void run() {
                try {
                    Thread.sleep(1);
                }catch (Exception e){}
                System.out.println("Thread_"+Thread.currentThread().getId()
                        +" ready init work step 1st......");
                latch.countDown();
                System.out.println("begin step 2nd.......");
                try {
                    Thread.sleep(1);
                }catch (Exception e){}
                System.out.println("Thread_"+Thread.currentThread().getId()
                        +" ready init work step 2nd......");
                latch.countDown();
            }
        }).start();
        new Thread(new BusiThread()).start();
        for(int i=0;i<=3;i++){
            Thread thread = new Thread(new InitThread());
            thread.start();
        }

        latch.await();
        System.out.println("Main do ites work........");
    }
}

 

最后修改于 2019-08-29 21:58:47
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付
上一篇