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

最新文章

  1. 引用Microsoft.Office.Interop.Excel出现的问题
  2. UVALive 6916---Punching Robot(卢卡斯+容斥)
  3. 探索 OpenStack 之(8):Neutron 深入探索之 OVS + GRE 之 完整网络流程 篇
  4. Excel 转Latex 及tex表格的处理 总结
  5. 把 Mac 上的 bash 换成 zsh
  6. Impossible to load an image in xcassets on bundle
  7. 从走出校门到Java实习生生活
  8. Java静态代码分析工具——FindBugs插件的安装与使用
  9. SVN 记录冲突、忽略
  10. (0)图像处理opengl 写在前面的话
  11. replicate-do-db参数引起的MySQL复制错误及处理办法
  12. 转:在MyEclipse下创建Java Web项目 入门(图文并茂)经典教程
  13. linux环境c++开发:ubuntu12.04使用llvm3.4.2
  14. 聊聊单元測试(一)——EasyMock
  15. MBProgressHUD各种样式用法
  16. jQuery:deferred [转]
  17. 基于前后端分离的身份认证方式——JWT
  18. 3;XHTML排列清单控制标记
  19. 动态sql and在前 逗号在后
  20. IoC之AutoFac(一)——简单使用和组件注册

热门文章

  1. 一个共通的viewModel搞定所有的分页查询一览及数据导出(easyui + knockoutjs + mvc4.0)
  2. JSP数据库连接成功
  3. Unity3D和网页数据交互的基本原理
  4. Python_selenium之处理Alert窗
  5. Eclipse设置护眼背景
  6. linux配置网关
  7. AndroidManifest.xml文件详解(activity)(二)
  8. DotNet软件开发框架
  9. [Go语言]从Docker源码学习Go——指针和Structs
  10. [LintCode] 带重复元素的排列