zl程序教程

您现在的位置是:首页 >  后端

当前栏目

java线程并发cyclicbarrier类使用示例

JAVA并发线程 使用 示例 CyclicBarrier
2023-06-13 09:15:16 时间

复制代码代码如下:


packagecom.yao;

importjava.util.Random;
importjava.util.concurrent.CyclicBarrier;

/**
 *CyclicBarrier类似于CountDownLatch也是个计数器,
 *不同的是CyclicBarrier数的是调用了CyclicBarrier.await()进入等待的线程数,
 *当线程数达到了CyclicBarrier初始时规定的数目时,所有进入等待状态的线程被唤醒并继续。
 *CyclicBarrier就象它名字的意思一样,可看成是个障碍,
 *所有的线程必须到齐后才能一起通过这个障碍。
 *CyclicBarrier初始时还可带一个Runnable的参数,
 *此Runnable任务在CyclicBarrier的数目达到后,所有其它线程被唤醒前被执行。
 */
publicclassCyclicBarrierTest{

 publicstaticclassComponentThreadimplementsRunnable{
  CyclicBarrierbarrier;//计数器
  intID; //组件标识
  int[]array; //数据数组

  //构造方法
  publicComponentThread(CyclicBarrierbarrier,int[]array,intID){
   this.barrier=barrier;
   this.ID=ID;
   this.array=array;
  }

  publicvoidrun(){
   try{
    array[ID]=newRandom().nextInt(100);
    System.out.println("Component"+ID+"generates:"+array[ID]);
    //在这里等待Barrier处
    System.out.println("Component"+ID+"sleep...");
    barrier.await();
    System.out.println("Component"+ID+"awaked...");
    //计算数据数组中的当前值和后续值
    intresult=array[ID]+array[ID+1];
    System.out.println("Component"+ID+"result:"+result);
   }catch(Exceptionex){
   }
  }
 }
 /**
 *测试CyclicBarrier的用法
 */
 publicstaticvoidtestCyclicBarrier(){
  finalint[]array=newint[3];
  CyclicBarrierbarrier=newCyclicBarrier(2,newRunnable(){
   //在所有线程都到达Barrier时执行
   publicvoidrun(){
    System.out.println("testCyclicBarrierrun...");
    array[2]=array[0]+array[1];
   }
  });

  //启动线程
  newThread(newComponentThread(barrier,array,0)).start();
  newThread(newComponentThread(barrier,array,1)).start();
 }

 publicstaticvoidmain(String[]args){
  CyclicBarrierTest.testCyclicBarrier();
 }
}