天天看点

Java多线程CyclicBarrier学习

cyclicbarrier是多线程并发控制实用工具

cyclicbarrier初始化时规定一个数目,然后调用await()方法进入等待的线程数。当线程数达到了这个数目时,所有进入等待状态的线程被唤醒并继续执行。

await() 方法没被调用一次,计数便会减少1,并阻塞住当前线程。当计数减至0时,阻塞解除,所有在此 cyclicbarrier 上面阻塞的线程开始运行。

cyclicbarrier就象它名字的意思一样,可看成是个障碍, 所有的线程必须到齐后才能一起通过这个障碍。

cyclicbarrier可以接收一个参数作为barrieraction,就是当计数器一次计算完成后,程序会执行的动作。如果你想学习java可以来这个群,首先是五三二,中间是二五九,最后是九五二,里面有大量的学习资料可以下载。  

Java多线程CyclicBarrier学习

import java.util.concurrent.brokenbarrierexception;  

import java.util.concurrent.cyclicbarrier;  

import java.util.concurrent.executorservice;  

import java.util.concurrent.executors;  

/** 

 *  

 * @author injavawetrust 

 * 

 */  

public class orange {  

    public static class pickorange implements runnable {  

        private int i;  

        private cyclicbarrier cb;  

        public pickorange(int i, cyclicbarrier cb) {  

            this.i = i;  

            this.cb = cb;  

        }  

        public void run() {  

            try {  

                pick();  

                cb.await(); // 等待所有橘子采摘完毕  

                box();  

                cb.await(); // 等待所有橘子装箱完毕  

            } catch (interruptedexception e) {  

                e.printstacktrace();  

            } catch (brokenbarrierexception e) {  

            }  

        public void pick() {  

            system.out.println("采摘第" + i +"个橘子完成!");  

        public void box() {  

            system.out.println("第" + i + "个橘子装箱完成!");  

    }  

    public static void main(string[] args) {  

        cyclicbarrier cb = new cyclicbarrier(5);  

        executorservice exec = executors.newfixedthreadpool(5);  

        for (int i = 1; i <= 5; i++) {  

            exec.submit(new thread(new pickorange(i, cb)));  

        exec.shutdown();  

}  

       结果:

Java多线程CyclicBarrier学习

采摘第2个橘子完成!  

采摘第1个橘子完成!  

采摘第5个橘子完成!  

采摘第4个橘子完成!  

采摘第3个橘子完成!  

第3个橘子装箱完成!  

第2个橘子装箱完成!  

第1个橘子装箱完成!  

第5个橘子装箱完成!  

第4个橘子装箱完成!