博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java多线程CyclicBarrier学习
阅读量:7113 次
发布时间:2019-06-28

本文共 1465 字,大约阅读时间需要 4 分钟。

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

 

  • CyclicBarrier初始化时规定一个数目,然后调用await()方法进入等待的线程数。当线程数达到了这个数目时,所有进入等待状态的线程被唤醒并继续执行。
  • await() 方法没被调用一次,计数便会减少1,并阻塞住当前线程。当计数减至0时,阻塞解除,所有在此 CyclicBarrier 上面阻塞的线程开始运行。
  • CyclicBarrier就象它名字的意思一样,可看成是个障碍, 所有的线程必须到齐后才能一起通过这个障碍。
  • CyclicBarrier可以接收一个参数作为barrierAction,就是当计数器一次计算完成后,程序会执行的动作。如果你想学习java可以来这个群,首先是五三二,中间是二五九,最后是九五二,里面有大量的学习资料可以下载。  

 

Java代码  
  1. import java.util.concurrent.BrokenBarrierException;  
  2. import java.util.concurrent.CyclicBarrier;  
  3. import java.util.concurrent.ExecutorService;  
  4. import java.util.concurrent.Executors;  
  5. /** 
  6.  *  
  7.  * @author InJavaWeTrust 
  8.  * 
  9.  */  
  10. public class Orange {  
  11.       
  12.     public static class PickOrange implements Runnable {  
  13.           
  14.         private int i;  
  15.         private CyclicBarrier cb;  
  16.           
  17.         public PickOrange(int i, CyclicBarrier cb) {  
  18.             this.i = i;  
  19.             this.cb = cb;  
  20.         }  
  21.           
  22.         public void run() {  
  23.             try {  
  24.                 pick();  
  25.                 cb.await(); // 等待所有橘子采摘完毕  
  26.                 box();  
  27.                 cb.await(); // 等待所有橘子装箱完毕  
  28.             } catch (InterruptedException e) {  
  29.                 e.printStackTrace();  
  30.             } catch (BrokenBarrierException e) {  
  31.                 e.printStackTrace();  
  32.             }  
  33.         }  
  34.           
  35.         public void pick() {  
  36.             System.out.println("采摘第" + i +"个橘子完成!");  
  37.         }  
  38.           
  39.         public void box() {  
  40.             System.out.println("第" + i + "个橘子装箱完成!");  
  41.         }  
  42.     }  
  43.       
  44.     public static void main(String[] args) {  
  45.         CyclicBarrier cb = new CyclicBarrier(5);  
  46.         ExecutorService exec = Executors.newFixedThreadPool(5);  
  47.         for (int i = 1; i <= 5; i++) {  
  48.             exec.submit(new Thread(new PickOrange(i, cb)));  
  49.         }  
  50.         exec.shutdown();  
  51.     }  
  52.   
  53. }  

       结果:

Java代码  
  1. 采摘第2个橘子完成!  
  2. 采摘第1个橘子完成!  
  3. 采摘第5个橘子完成!  
  4. 采摘第4个橘子完成!  
  5. 采摘第3个橘子完成!  
  6. 3个橘子装箱完成!  
  7. 2个橘子装箱完成!  
  8. 1个橘子装箱完成!  
  9. 5个橘子装箱完成!  
  10. 4个橘子装箱完成!  

转载地址:http://ayzel.baihongyu.com/

你可能感兴趣的文章
实例:使用puppeteer headless方式抓取JS网页
查看>>
一个“MacBook”新手的Python“笨办法”自学之旅 #第六章:常用的简易Python命令、符号、代码、格式化字符串...
查看>>
C++——类的成员函数指针以及mem_fun适配器
查看>>
常州day1p4
查看>>
cuda_c学习笔记-向量加法
查看>>
Spring MVC的总体设计
查看>>
sort命令
查看>>
Alpha 冲刺报告模板
查看>>
SpringBoot中使用JWT
查看>>
poj 3694 Network
查看>>
对象复制问题 && lvalue-rvalue && 引用
查看>>
第十周作业
查看>>
【ABP框架系列学习】N层架构(3)
查看>>
HTML5本地数据库
查看>>
iOS导航栏状态栏相关
查看>>
JSON
查看>>
SQL Injection (Blind) Low
查看>>
Neo4j CQL -(8)- WHERE子句
查看>>
VS2017专业版和企业版激活密钥
查看>>
python 类进阶
查看>>