zoukankan      html  css  js  c++  java
  • java多线程-CountDownLatch

    CountDownLatch

    主要方法:

    public void await() throws InterruptedException ;   //调用后线程阻塞,直到count减为0
    public boolean await(long timeout, TimeUnit unit) throws InterruptedException ;  //有超时的await,超时时间到到达后,线程不再阻塞继续执行,可中断
    public void countDown() ;  //将count值减1

    应用:

    //子服务
    class Server implements Runnable {
    
        private String name;
        private CountDownLatch latch;
    
        Server(String name, CountDownLatch latch){
            this.name = name;
            this.latch = latch;
        }
    
        @Override
        public void run() {
            try{
                start();
                System.out.println(name +":start over");
            }finally {
                latch.countDown();
            }
    
        }
    
        private void start() {
            try {
                System.out.println(name+":start");
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    
    
    //主服务
    class MainServer implements Runnable {
    
        private CountDownLatch latch;
    
        MainServer(CountDownLatch latch){
            this.latch = latch;
        }
    
        @Override
        public void run() {
            try {
                latch.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("MainServer start");
        }
    
    }
    public static void main(String[] args) {
                CountDownLatch countDownLatch = new CountDownLatch(3);
                Server server1 = new Server("Server a",countDownLatch);
                Server server2 = new Server("Server b",countDownLatch);
                Server server3 = new Server("Server c",countDownLatch);
                MainServer mainServer = new MainServer(countDownLatch);
    
                new Thread(server1).start();
                new Thread(server2).start();
                new Thread(server3).start();
                new Thread(mainServer).start();
            }

    结果:

    Server a:start
    Server c:start
    Server b:start
    Server a:start over
    Server c:start over
    Server b:start over
    MainServer start

    上例中模拟一个主服务和3个子服务启动,主服务的启动依赖子服务启动,只有当3个子服务都启动完成后主服务才会执行启动。

    要点:

    1. 一个CountDownLatch对象只能使用一次,无法重复使用。
    2. latch.countDown(); 建议放到finally语句里,countDown是原子操作。
  • 相关阅读:
    难道真的是RedBook错了?
    用一个土办法证明RedBook的错误
    Md5 Loader Demo
    simple shadow mapping
    又遇到让人疑惑的问题
    [洛谷P1037][题解]产生数
    [洛谷P1279][题解]字串距离
    [洛谷P1122][题解]最大子树和
    [洛谷P1144][题解]最短路计数
    Vue 之 Data
  • 原文地址:https://www.cnblogs.com/liuboyuan/p/10650392.html
Copyright © 2011-2022 走看看