Java并发之CyclicBarria的使用

Posted 正井猫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java并发之CyclicBarria的使用相关的知识,希望对你有一定的参考价值。

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

 

以上是关于Java并发之CyclicBarria的使用的主要内容,如果未能解决你的问题,请参考以下文章

java并发编程之上下文切换等并发编程的挑战

Java并发编程之线程调度

Java并发前期知识点

Java并发并发编程的挑战

Java面试之多线程

Java面试之多线程