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();
    }
}
时间: 2024-08-26 04:38:31

Java并发之CyclicBarria的使用(二)的相关文章

Java并发之CyclicBarria的使用

Java并发之CyclicBarria的使用 一.简介 笔者在写CountDownLatch这个类的时候,看到了博客园上的<浅析Java中CountDownLatch用法>这篇博文,为博主扎实的技术功底所折服,对Java多线程方面的只是信手拈来,首先在此感谢博主给了我灵感,让我进一步了解了CountDownLatch的用法,在此请收下小弟的膝盖(如果博主能够看到的化).借着<浅析Java中CountDownLatch用法>这篇博文,笔者想借着这个例子说一下 CyclicBarria

JAVA 1.5 并发之 Executor框架 (二)execute VS submit

http://www.cnblogs.com/rockman12352/p/3788688.html 上一篇对于整体框架讲了很多东西,但是具体在使用时有一些细节并没有说出来 首先是执行任务 execute(); 执行任务,返回空,相当于 new Thread(task).start(); submit();   执行任务,但是会返回一个future<T>,就是计算好的结果,如果没有计算好则会阻塞,还有一个好处是可以管理exception public static void main(Stri

Java并发之synchronized关键字深度解析(二)

前言 本文继续[Java并发之synchronized关键字深度解析(一)]一文而来,着重介绍synchronized几种锁的特性. 一.对象头结构及锁状态标识 synchronized关键字是如何实现的给对象加锁?首先我们要了解一下java中对象的组成.java中的对象由3部分组成,第一部分是对象头,第二部分是实例数据,第三部分是对齐填充. 对齐填充:jvm规定对象的起始内存地址必须是8字节的整数倍,如果不够的话就用占位符来填充,此部分占位符就是对齐填充: 实例数据:实例数据是对象存储的真正有

Java并发之AQS源码分析(二)

我在Java并发之AQS源码分析(一)这篇文章中,从源码的角度深度剖析了 AQS 独占锁模式下的获取锁与释放锁的逻辑,如果你把这部分搞明白了,再看共享锁的实现原理,思路就会清晰很多.下面我们继续从源码中窥探共享锁的实现原理. 共享锁 获取锁 public final void acquireShared(int arg) { // 尝试获取共享锁,小于0表示获取失败 if (tryAcquireShared(arg) < 0) // 执行获取锁失败的逻辑 doAcquireShared(arg)

深入剖析java并发之阻塞队列LinkedBlockingQueue与ArrayBlockingQueue

关联文章: 深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(enum) 深入理解Java注解类型(@Annotation) 深入理解Java类加载器(ClassLoader) 深入理解Java并发之synchronized实现原理 Java并发编程-无锁CAS与Unsafe类及其并发包Atomic 深入理解Java内存模型(JMM)及volatile关键字 剖析基于并发AQS的重入锁(ReetrantLock)及其Condition实现原理 剖析基于并发AQS的共

Java并发之CountDownLatch的使用

Java并发之CountDownLatch的使用 一. 简介 Java的并发包早在JDK5这个版本中就已经推出,而且Java的并发编程是几乎每个Java程序员都无法绕开的屏障.笔者今晚在家闲来无事,翻看了以前的博客,发现好久都没有写过博客,就想着写点东西,写点什么好了,思来想去很久,决定在这段时间里写写关于Java并发相关的东西.由于是突然兴起,所有就没有什么规划,想到什么就写点什么吧,没想到首先想到的就是CountDownLatch的这个类,那就说说这个类吧. 二. CountDownLatc

Java并发之Semaphore的使用

Java并发之Semaphore的使用 一.简介 今天突然发现,看着自己喜欢的球队发挥如此的棒,然后写着博客,这种感觉很爽.现在是半场时间,就趁着这个时间的空隙,说说Java并发包中另外一个重量级的类Semaphore,这个类从字面意义上理解是"信号量". 那么什么是信号量呢?我用一种比较通俗的方式来跟大家解释一下,就是在该类初始化的时候,给定一个数字A,每个线程调用acquire()方法后,首先判断A是否大于0,如果大于0,就将A减去1,然后执行对应的线程,如果不大于0,那么就会阻塞

Java并发之BlockingQueue的使用

Java并发之BlockingQueue的使用 一.简介 前段时间看到有些朋友在网上发了一道面试题,题目的大意就是:有两个线程A,B,  A线程每200ms就生成一个[0,100]之间的随机数, B线程每2S中打印出A线程所产生的增量随机数.其实该题目笔者认为考察的知识点就是本博文要给大家介绍的BlockingQueue这个接口,对于该题目笔者认为考察的只是面试者对这个类是否掌握,别无其他. 二.BlockingQueue的使用 BlockingQueue是一个阻塞队列,用户可以为该队列设置一个

java并发之hashmap源码

在上篇博客中分析了hashmap的用法,详情查看java并发之hashmap 本篇博客重点分析下hashmap的源码(基于JDK1.8) 一.成员变量 HashMap有以下主要的成员变量 /** * The default initial capacity - MUST be a power of two. 默认初始容量 */ static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 /** * The maximum capa