前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CyclicBarrier的使用

CyclicBarrier的使用

作者头像
吉林乌拉
发布2019-08-14 17:47:43
5760
发布2019-08-14 17:47:43
举报
文章被收录于专栏:吉林乌拉吉林乌拉

CyclicBarrier和CountDownLatch一样在使用时也需要在构造方法中传递一个int类型的参数,但这个参数代表的含义和在使用上与CountDownLatch有所区别,这个参数代表的是拦截线程的数量,当线程调用CyclicBarrier中的await()方法时,就是告诉CyclicBarrier我已经拦截了当前线程,也就是此时调用await()方法的线程将被阻塞,线程中await()方法后面的代码将不会执行,当前线程会一直等待,一到调用await()方法的线程数量与CyclicBarrier构造方法中参数的数量一致时,线程才会重新执行。下面我们看一下简单的例子来演示一下CyclicBarrier的使用。

下面我们详细分析一下输出的信息。我们在CyclicBarrier构造方法中传递的参数是2也就是说它要拦截2个线程的await()方法后才会执行await()方法后面的逻辑。所以在调用await()方法之前线程是不会阻塞的。所以会出输出开始、计时等信息,我们会发现当线程Thread-1已经执行完循环任务时,并没有马上输出await()方法后面的代码,而是此线程阻塞了,原因是Thread-0还没有实现完,它还没有执行await()方法,也就是说拦截的线程数量还没有达到CyclicBarrier构造方法中传递数量,所以线程Thread-1就会一直阻塞直到Thread-0执行完循环并执行await()方法时,此时拦截的线程数量已经等于构造方法中的参数了,所以线程Thread-1才会恢复执行。这就是CyclicBarrier的使用。

CyclicBarrier与CountDownLatch的区别:

  • CountDownLatch阻塞的是主线程
  • CountDownLatch的计数器只能使用一次也就是只能递减
  • CyclicBarrier阻塞的是子线程
  • CyclicBarrier的计数器可以使用reset()方法重置

CyclicBarrier还提供了另一个构造方法除了传递int类型的参数外,还可以传递一个Runnable类型。它的目的是,当线程的拦截的数量与构造方法的参数相等时,优先执行构造方法里的任务,然后在执行每个线程中await()方法后面的代码。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 吉林乌拉 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档