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是原子操作。
  • 相关阅读:
    Android硬件访问服务中的HAL-查看打印的信息
    JAVA程序通过JNI调用C/C++库
    How to install android studio on ubuntu14.04
    Android驱动-Java入门学习(java安装)
    ubuntu系统64位dnw
    ubuntu安装nfs服务
    人脸识别--SeetaFace
    在Ubuntu14.04下配置Samba 完成linux和windows之间的文件共享
    Android驱动学习-Eclipse安装与配置
    unsupported major.minor version
  • 原文地址:https://www.cnblogs.com/liuboyuan/p/10650392.html
Copyright © 2011-2022 走看看