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