zoukankan      html  css  js  c++  java
  • 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();
        }
    }
  • 相关阅读:
    小白使用分布式追踪系统
    小白使用Hystrix
    Java泛型的协变与逆变
    try-finally的时候try里面带return
    URLEncoder.encode编码空格变+号
    匿名内部类和Lambda表达式是一样的吗?
    Spring Cloud Config配置git私钥出错
    Git本地已有项目关联远程仓库
    第一次使用HSDB
    Springboot应用使用Docker部署
  • 原文地址:https://www.cnblogs.com/miller-zou/p/6954265.html
Copyright © 2011-2022 走看看