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(); } }