欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java中CyclicBarrier的用法分析

程序员文章站 2023-12-10 20:45:04
复制代码 代码如下:public class testcyclicbarrier {     private static fina...

复制代码 代码如下:

public class testcyclicbarrier {

     private static final int thread_num = 5;

     public static class workerthread implements runnable{

         cyclicbarrier barrier;

         public workerthread(cyclicbarrier b){
             this.barrier = b;
         }

         @override
         public void run() {
             // todo auto-generated method stub
             try{
                 system.out.println("worker's waiting");
                 //线程在这里等待,直到所有线程都到达barrier。
                 barrier.await();
                 system.out.println("id:"+thread.currentthread().getid()+" working");
             }catch(exception e){
                 e.printstacktrace();
             }
         }

     }

     /**
      * @param args
      */
     public static void main(string[] args) {
         // todo auto-generated method stub
         cyclicbarrier cb = new cyclicbarrier(thread_num, new runnable() {
             //当所有线程到达barrier时执行
             @override
             public void run() {
                 // todo auto-generated method stub
                 system.out.println("inside barrier");

             }
         });

         for(int i=0;i<thread_num;i++){
             new thread(new workerthread(cb)).start();
         }
     }

 }
 /*
 以下是输出:
 worker's waiting
 worker's waiting
 worker's waiting
 worker's waiting
 worker's waiting
 inside barrier
 id:12 working
 id:8 working
 id:11 working
 id:9 working
 id:10 working
 */

1. cyclicbarrier初始化时规定一个数目,然后计算调用了cyclicbarrier.await()进入等待的线程数。当线程数达到了这个数目时,所有进入等待状态的线程被唤醒并继续。
2. cyclicbarrier就象它名字的意思一样,可看成是个障碍, 所有的线程必须到齐后才能一起通过这个障碍。
3. cyclicbarrier初始时还可带一个runnable的参数, 此runnable任务在cyclicbarrier的数目达到后,所有其它线程被唤醒前被执行。