浅谈Java中CyclicBarrier的用法

深碍√TFBOYSˉ_ 2021-06-24 14:36 596阅读 0赞

CyclicBarrier和CountDownLatch一样,都是关于线程的计数器。

用法略有不同,测试代码如下:

  1. public class TestCyclicBarrier {
  2. private static final int THREAD_NUM = 5;
  3. public static class WorkerThread implements Runnable{
  4. CyclicBarrier barrier;
  5. public WorkerThread(CyclicBarrier b){
  6. this.barrier = b;
  7. }
  8. @Override
  9. public void run() {
  10. // TODO Auto-generated method stub
  11. try{
  12. System.out.println("Worker's waiting");
  13. //线程在这里等待,直到所有线程都到达barrier。
  14. barrier.await();
  15. System.out.println("ID:"+Thread.currentThread().getId()+" Working");
  16. }catch(Exception e){
  17. e.printStackTrace();
  18. }
  19. }
  20. }
  21. /**
  22. * @param args
  23. */
  24. public static void main(String[] args) {
  25. // TODO Auto-generated method stub
  26. CyclicBarrier cb = new CyclicBarrier(THREAD_NUM, new Runnable() {
  27. //当所有线程到达barrier时执行
  28. @Override
  29. public void run() {
  30. // TODO Auto-generated method stub
  31. System.out.println("Inside Barrier");
  32. }
  33. });
  34. for(int i=0;i<THREAD_NUM;i++){
  35. new Thread(new WorkerThread(cb)).start();
  36. }
  37. }
  38. }
  39. /*
  40. 以下是输出:
  41. Worker's waiting
  42. Worker's waiting
  43. Worker's waiting
  44. Worker's waiting
  45. Worker's waiting
  46. Inside Barrier
  47. ID:12 Working
  48. ID:8 Working
  49. ID:11 Working
  50. ID:9 Working
  51. ID:10 Working
  52. */
  1. CyclicBarrier初始化时规定一个数目,然后计算调用了CyclicBarrier.await()进入等待的线程数。当线程数达到了这个数目时,所有进入等待状态的线程被唤醒并继续。
  2. CyclicBarrier就象它名字的意思一样,可看成是个障碍, 所有的线程必须到齐后才能一起通过这个障碍。
  3. CyclicBarrier初始时还可带一个Runnable的参数, 此Runnable任务在CyclicBarrier的数目达到后,所有其它线程被唤醒前被执行。

发表评论

表情:
评论列表 (有 0 条评论,596人围观)

还没有评论,来说两句吧...

相关阅读

    相关 BroadcastReceiver

      最近看了下关于广播方面的东西,加深了理解,也纠正了自己以前的不正确的看法。   关于广播有2中注册方式,一种是在代码中注册,也叫动态注册,另一种是在AndroidMa