正井猫

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

Java并发之CountDownLatch的使用

一. 简介

  Java的并发包早在JDK5这个版本中就已经推出,而且Java的并发编程是几乎每个Java程序员都无法绕开的屏障。笔者今晚在家闲来无事,翻看了以前的博客,发现好久都没有写过博客,就想着写点东西,写点什么好了,思来想去很久,决定在这段时间里写写关于Java并发相关的东西。由于是突然兴起,所有就没有什么规划,想到什么就写点什么吧,没想到首先想到的就是CountDownLatch的这个类,那就说说这个类吧。

二. CountDownLatch的使用

      例如有这么一个需求:要删除一个文件夹A, 文件夹下有三个文件夹,分别为B, C, D,大家都知道,我们要删除文件夹A, 就必须先删除B, C,D这三个文件夹,我们分别启动三个线程分别删除B, C, D, 最后再删除A,我们再假设B, C, D的大小差距很大,那么每个线程执行的时间肯定不一样,我们该如何保证在删除A的时候,B, C, D已经删除了呢?此时用CountDownLatch,笔者认为最合适不过了。我们直接上代码:

public class CountDownLatchTest {
    
    static class DeleteInnerDir extends Thread{
        
        private CountDownLatch cdl;
        private String path;
        
        public DeleteInnerDir(CountDownLatch cdl, String path){
            this.cdl = cdl;
            this.path = path;
        }
        
        @Override
        public void run() {
            try {
                FileUtils.deleteDirectory(new File(path));
                System.out.println(Thread.currentThread().getName() + " 操作成功...");
            } catch (IOException e) {
                e.printStackTrace();
            }finally{
                cdl.countDown();  //将数字 -1
            }
        }
    }
    
    public static void main(String[] args) throws Exception {
        //表示有三个线程来执行,内部维持着一个数字3,当执行等待await()方法的时候,
        //每个线程执行一次countDown()方法,将数字 -1, 当数字为0的时候,就接着执行
        CountDownLatch cdl = new CountDownLatch(3);  
        
        Thread t1 = new DeleteInnerDir(cdl, "d:/test/mavne");
        Thread t2 = new DeleteInnerDir(cdl, "d:/test/eclipse");
        Thread t3 = new DeleteInnerDir(cd1, "d:/test/tomcat");
        
        t1.start();
        t2.start();
        t3.start(); 

        System.out.println("开始等待。。。。");
        cdl.await();
        System.out.println("等待结束。。。。。");
        
        File file = new File("d:/test");
     file.delete();
} }

 

posted on 2017-06-06 23:04  正井猫  阅读(433)  评论(0编辑  收藏  举报