zl程序教程

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

当前栏目

Java中CyclicBarrier的用法分析

JAVA 分析 用法 CyclicBarrier
2023-06-13 09:14:47 时间

复制代码代码如下:


publicclassTestCyclicBarrier{

    privatestaticfinalintTHREAD_NUM=5;

    publicstaticclassWorkerThreadimplementsRunnable{

        CyclicBarrierbarrier;

        publicWorkerThread(CyclicBarrierb){
            this.barrier=b;
        }

        @Override
        publicvoidrun(){
            //TODOAuto-generatedmethodstub
            try{
                System.out.println("Worker"swaiting");
                //线程在这里等待,直到所有线程都到达barrier。
                barrier.await();
                System.out.println("ID:"+Thread.currentThread().getId()+"Working");
            }catch(Exceptione){
                e.printStackTrace();
            }
        }

    }

    /**
     *@paramargs
     */
    publicstaticvoidmain(String[]args){
        //TODOAuto-generatedmethodstub
        CyclicBarriercb=newCyclicBarrier(THREAD_NUM,newRunnable(){
            //当所有线程到达barrier时执行
            @Override
            publicvoidrun(){
                //TODOAuto-generatedmethodstub
                System.out.println("InsideBarrier");

            }
        });

        for(inti=0;i<THREAD_NUM;i++){
            newThread(newWorkerThread(cb)).start();
        }
    }

 }
 /*
 以下是输出:
 Worker"swaiting
 Worker"swaiting
 Worker"swaiting
 Worker"swaiting
 Worker"swaiting
 InsideBarrier
 ID:12Working
 ID:8Working
 ID:11Working
 ID:9Working
 ID:10Working
 */

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