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