zoukankan      html  css  js  c++  java
  • CountDownLatch总结

    1:概念原理:

      countDownLatch这个类使一个线程等待其他线程各自执行完毕后再执行。是通过一个计数器来实现的,计数器的初始值是线程的数量。每当一个线程执行完毕后,计数器的值就-1,当计数器的值为0时,表示所有线程都执行完毕,然后在闭锁上等待的线程就可以恢复工作了。使用该API的时候,需要已知总共的线程数量,该API长和多线程、线程池一起合作。


    2:常用API总结:

    //参数count为计数值
    publicCountDownLatch(intcount){};
    //调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行
    publicvoidawait()throwsInterruptedException{};
    //和await()类似,只不过等待一定的时间后count值还没变为0的话就会继续执行
    publicbooleanawait(longtimeout,TimeUnitunit)throwsInterruptedException{};
    //将count值减1
    publicvoidcountDown(){};

    3:该类是和多线程关系紧密的,一般用在多线程环境下,和线程池一起使用

    4:代码如下所示:

    public class CountDownLatchTest {
    
        public static void main(String[] args) {
            final CountDownLatch latch = new CountDownLatch(2);
            System.out.println("主线程开始执行…… ……");
            //第一个子线程执行
            ExecutorService es1 = Executors.newSingleThreadExecutor();
            es1.execute(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(3000);
                        System.out.println("子线程:"+Thread.currentThread().getName()+"执行");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    latch.countDown();
                }
            });
            es1.shutdown();
            //第二个子线程执行
            ExecutorService es2 = Executors.newSingleThreadExecutor();
            es2.execute(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("子线程:"+Thread.currentThread().getName()+"执行");
                    latch.countDown();
                }
            });
            es2.shutdown();
            System.out.println("等待两个线程执行完毕…… ……");
            try {
                latch.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("两个子线程都执行完毕,继续执行主线程");
        }
    }

    执行结果如下所示:

    主线程开始执行…… ……
    等待两个线程执行完毕…… ……
    子线程:pool-1-thread-1执行
    子线程:pool-2-thread-1执行
    两个子线程都执行完毕,继续执行主线程

    郭慕荣博客园
  • 相关阅读:
    canvas实现文字分行
    二维码扫描添加闪光灯的功能
    修改二维码扫描框的大小位置
    Android中实现EditText圆角的方法
    利用FrameLayout实现遮罩层
    EditText中的灰色提示
    实现等待动画
    发送短信
    自定义EditText动态在EditText中添加图片
    xml解析
  • 原文地址:https://www.cnblogs.com/jelly12345/p/12108217.html
Copyright © 2011-2022 走看看