`
a3x60
  • 浏览: 7439 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java CylicBarrier使用方法

阅读更多
一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。CyclicBarrier 支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作 很有用。
主要方法:
//设置parties、count及barrierCommand属性。   
CyclicBarrier(int):   
  
//当await的数量到达了设定的数量后,首先执行该Runnable对象。   
CyclicBarrier(int,Runnable):   
  
//通知barrier已完成线程   
await(): 


//设置parties、count及barrierCommand属性。
CyclicBarrier(int):

//当await的数量到达了设定的数量后,首先执行该Runnable对象。
CyclicBarrier(int,Runnable):

//通知barrier已完成线程
await():

应用场景
在某种需求中,比如一个大型的任务,常常需要分配好多子任务去执行,只有当所有子任务都执行完成时候,才能执行主任务,这时候,就可以选择CyclicBarrier了。

实例分析
大家集合好后才开始出发,分散活动后又在i指定地点集合碰面,这就好比整个公司的人员利用周末时间集体郊游一样,先各自从家出发到公司集合后,再同时出发到公园游玩,在指定地点集合后再同时开始就餐……
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class CyclicBarrierTest {
 public static void main(String [] args){
  ExecutorService service=Executors.newCachedThreadPool();
  final CyclicBarrier cb=new CyclicBarrier(3);  //三个线程同时到达
  for(int i=0;i<3;i++){          
   Runnable runnable=new Runnable(){
    public void run(){
     try {
      Thread.sleep((long)(Math.random()*10000));
      System.out.println("线程"+Thread.currentThread().getName()+
        "即将到达集合地点1,当前已有"+(cb.getNumberWaiting()+1)+"个已到达"+
        (cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候"));
      try {
       cb.await();
      } catch (BrokenBarrierException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
      }
      Thread.sleep((long)(Math.random()*10000));
      System.out.println("线程"+Thread.currentThread().getName()+
        "即将到达集合地点2,当前已有"+(cb.getNumberWaiting()+1)+"个已到达"+
        (cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候"));
      try {
       cb.await();
      } catch (BrokenBarrierException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
      }
      Thread.sleep((long)(Math.random()*10000));
      System.out.println("线程"+Thread.currentThread().getName()+
        "即将到达集合地点3,当前已有"+(cb.getNumberWaiting()+1)+"个已到达"+
        (cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候"));
      try {
       cb.await();
      } catch (BrokenBarrierException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
      }
     } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
    }
   };
   service.execute(runnable);
  }
  service.shutdown();
 }
}


运行结果:

线程pool-1-thread-3即将到达集合地点1,当前已有1个已到达正在等候
线程pool-1-thread-2即将到达集合地点1,当前已有2个已到达正在等候
线程pool-1-thread-1即将到达集合地点1,当前已有3个已到达都到齐了,继续走啊
线程pool-1-thread-1即将到达集合地点2,当前已有1个已到达正在等候
线程pool-1-thread-2即将到达集合地点2,当前已有2个已到达正在等候
线程pool-1-thread-3即将到达集合地点2,当前已有3个已到达都到齐了,继续走啊
线程pool-1-thread-2即将到达集合地点3,当前已有1个已到达正在等候
线程pool-1-thread-1即将到达集合地点3,当前已有2个已到达正在等候
线程pool-1-thread-3即将到达集合地点3,当前已有3个已到达都到齐了,继续走啊
分享到:
评论

相关推荐

    java 泛型方法使用示例

    下面我们将深入探讨Java泛型方法的概念、语法以及使用示例。 **一、泛型方法概念** 泛型方法是一种具有类型参数的方法,这些类型参数可以在方法声明时指定,并在方法体内部使用。与类的泛型类似,它们提供了编译时...

    使用Java自动化方法模拟Android人工点击、触屏事件(含platform-tools工具)

    本篇文章将深入探讨如何使用Java自动化方法模拟Android的人工点击和触屏事件,同时涉及`platform-tools`工具包中的adb(Android Debug Bridge)。 首先,`platform-tools`是Android SDK的一部分,包含了adb工具,这...

    java中main方法发送httpPost请求

    这可以通过`java.net.URL`类的`openConnection()`方法实现: ```java URL url = new URL("http://target.com/api"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); ``` 2. **...

    java动态识别文件编码EncodingDetect.java附使用方法很简单

    当我们循环遍历文件进行操作的时候可能遇到各种各样的文件编码格式,如果不知道当前循环的文件格式的话,将会遇到各种各样的问题,...使用java动态识别文件编码EncodingDetect.java这个工具类以后就变得异常简单了!

    bat 运行java main方法

    接下来,我们将详细探讨如何创建和使用`bat`文件来运行Java的`main`方法。 首先,确保你有一个已经打包好的`jar`文件,这个文件包含了你的Java类和对应的`main`方法。`jar`文件是Java的归档文件,它将多个类文件...

    javatwain 使用扫描仪

    本程序实现了在web页面上,用JAVA的方式,调用扫描仪进行扫描,并上传至远程服务器。并且可以设置扫描范围、扫描精度、以及扫描UI显示等! 该版本在uploadpath参数设置为“http://localhost/xxx.action”,即使用...

    把wsdl文件转换成java类 使用wsdl2Java工具

    5. **集成到项目中**: 将生成的Java类导入你的Java项目,然后就可以像调用普通Java方法一样调用Web服务。 6. **调用Web服务**: 使用客户端代理类,实例化并调用对应的方法,传入参数,即可完成对Web服务的调用。 7...

    java swing项目皮肤包+使用方法说明

    - 使用`UIManager.setLookAndFeel()`方法将加载的LookAndFeel应用到整个应用程序。 ```java try { UIManager.setLookAndFeel(lookAndFeel); } catch (UnsupportedLookAndFeelException ulafe) { ulafe....

    C#调用java类、jar包方法

    在跨平台开发中,有时需要将不同编程语言的组件整合在一起,例如在C#应用中调用Java类或使用Java的jar包。本篇将详细阐述如何在C#环境中实现对Java类的调用以及使用Java的jar包。 首先,要理解C#与Java之间的互操作...

    java解析wsdl文档获取方法与参数

    本文将深入探讨如何使用Java来解析WSDL文档,提取其中的方法和参数。 首先,理解WSDL的基本结构是必要的。一个WSDL文件通常包含服务定义、消息定义、端点(port)定义以及绑定定义。服务定义指明了服务的名称,消息...

    java中set、list和map的使用方法实例

    // java中对象容器主要有Set,List和Map三个接口类。 // 迭代器(Iterator)模式,又叫做游标(Cursor)模式。 // GOF给出的定义为:提供一种方法访问一个容器...另包含一篇网文:在java中使用TreeMap进行中文排序

    java反射,获取所有属性、方法以及List集合类

    本篇文章将深入探讨如何使用Java反射来获取一个类的所有属性、方法,并处理List集合类。 首先,让我们了解Java反射的基础概念。在Java中,`java.lang.Class`类代表运行时的类信息。我们可以使用`Class.forName()`...

    Java clone方法使用

    详细的描述了Java中 clone方法使用

    JAVA文档 详细介绍JAVA中的接口使用方法

    JAVA文档 详细介绍JAVA中的接口使用方法 有助于初学者的使用

    dwr dwr项目 js 调用 java 后台 方法 js调用java后台方法 后台方法 异步

    下面将详细阐述DWR的工作原理、配置过程以及如何使用DWR实现JS调用Java后台方法。 1. **DWR概述** DWR的核心功能是提供一种安全、高效的远程方法调用机制,通过HTTP协议在客户端(浏览器)和服务器之间传递数据。...

    ECharts-java 的使用demo

    设置好图表和配置项后,使用ECharts-java提供的方法将这些配置转化为JSON字符串。这个字符串将被发送到前端,并用于绘制图表。 6. **前端展示**: 在HTML页面中,你需要引入ECharts的JavaScript库,并设置一个...

    Java2Pas Java代码转pas代码

    Java是一种广泛使用的高级编程语言,以其平台无关性和强大的类库支持闻名。它的语法受到C++的影响,但引入了垃圾回收机制,简化了内存管理。另一方面,Pascal则是一种较老的语言,源于1970年代,因其清晰的语法结构...

    [测试通过]JAVA调用第三方DLL的简单方法:JNA及DEMO

    DEMO提供了两个Java文件:"mathfundll.java"和"testmathfundll.java",它们展示了如何使用JNA来调用DLL中的方法。 1. **mathfundll.java**:这个文件定义了Java接口,它映射了DLL中的函数。例如,可能有一个名为`...

    使用java快速判断网页链接是否有效

    本文将详细介绍如何使用Java语言来实现一个简单的工具方法,用于快速判断一个网页链接是否有效。 #### 一、方法原理 本方法通过`java.net.URL`类创建一个URL对象,并使用`java.net.HttpURLConnection`类打开与该...

    java使用HttpClient通过url下载文件到本地

    - **创建HttpClient实例**:首先,我们需要创建一个HttpClient对象,例如使用`HttpClientBuilder`或`HttpClients.createDefault()`方法。 - **构建HttpGet请求**:使用`HttpGet`类创建一个HTTP GET请求,指定要...

Global site tag (gtag.js) - Google Analytics