Java并发之CyclicBarria的使用(二)

一.简介

  之前借助于其他大神写过一篇关于CyclicBarria用法的博文,但是内心总是感觉丝丝的愧疚,因为笔者喜欢原创,而不喜欢去转载一些其他的文章,为此笔者自己原创了一个CyclicBarria的用法的示例Demo, 在此声明,该Demo没有实际的价值,仅仅只是演示CyclicBarria的用法,希望加深读者对"循环栅栏"的用法加深理解。

二.使用

  需求假设:在D盘下有一个test文件夹,我们要使用两个线程将文件夹A, B, 拷贝到test目录下,必须要等到两个文件夹都拷贝完毕,然后再将其删除。

public class CyclicBarriaTest {

    static class ProcessDir extends Thread{

        private CyclicBarrier cb;

        private CountDownLatch cdl;

        private String path;

        private int num;

        public ProcessDir(String path, CyclicBarrier cb, int num, CountDownLatch cdl){
this.num = num;
this.cb = cb;
this.path = path;
this.cdl = cdl;
} @Override
public void run() {
try {
cb.await();
copyDir();
cb.await();
deleteDir();
} catch (Exception e) {
e.printStackTrace();
}finally{
cdl.countDown();
}
} /**
* 拷贝文件夹
* @throws IOException
*/
public void copyDir() throws IOException{
if(num == 1){
FileUtils.copyDirectory(new File("D:/eclipse"), new File(path));
} if(num == 2){
FileUtils.copyDirectory(new File("D:/maven"), new File(path));
}
} /**
* 删除文件夹
* @throws IOException
*/
public void deleteDir() throws IOException{
if(num == 1){
FileUtils.deleteDirectory(new File("d:/test/eclipse"));
} if(num == 2){
FileUtils.deleteDirectory(new File("d:/test/maven"));
}
}
} static class ShowInfo implements Runnable{ private boolean flag; public ShowInfo(boolean flag){
this.flag = flag;
} @Override
public void run() {
if(flag){
System.out.println("所有的线程已经 准备完毕,开始执行拷贝");
flag = false;
}else{
System.out.println("数据拷贝完毕,开始执行删除");
}
}
} public static void main(String[] args) throws InterruptedException {
CyclicBarrier cb = new CyclicBarrier(2, new ShowInfo(true));
CountDownLatch cdl = new CountDownLatch(2); for(int i = 1; i <= 2; i++){
new ProcessDir("d:/test", cb, i, cdl).start();
} cdl.await(); File file = new File("d:/test");
file.delete();
}
}
04-30 21:48