Java 并发编程系列——常用并发工具类
接上一篇,写写几个常用的并发编程中使用的工具类,CountDownLatch,CyclicBarrier,Semaphore和Exchanger。
接下来分别以示例的方式来介绍这几个工具类。
CountDownLatch,其场景主要应用在一个任务等待其他任务执行N次后才执行。假设我们定义了两个线程类,这两个线程类中当执行完本线程的任务将计数减1,再定义一个等待线程,当计数为0时执行本线程的任务。
示例代码:
如上代码所示,我们定义了计数值为3,共开启6个线程,其中这6个线程中都会执行计数扣减,当扣减为0时,等待线程中的任务执行。这里需要注意,计数为0时等待线程并非马上执行,而是要等做扣减的任务执行完后以后。这一点我们可以从结果输出上看出来。
await方法可以带超时参数,当有等待时间要求时,可使用带超时的await方法。
CyclicBarrier,其场景主要为有一组线程,当所有线程执行到某一个时刻,这组线程才能继续向下执行。CyclicBarrier构造时可以传入一个Runnable,即当一组线程执行到某一时刻点时这个Runnable随这一组线程一起执行。
示例代码:
从如下输出结果上可以看出,当线程全部执行到await方法时,这一组线程继续执行后续任务,并且同时执行CyclicBarrier中的Runnable。同样可使用带超时的await方法,结果:
CountDownLatch与CyclicBarrier的区别
CountDownLatch主要由外部线程来控制线程是否往下执行,而CyclicBarrier是由一组线程自身来控制。比如,我们有一个计算任务,必须等到前置的若干个计算完成后才能启动,这时候就可以用CountDownLatch来实现。又比如,我们要测试一个服务的瞬间响应能力,希望启动一批线程,当线程全部准备好后,同时执行调用该服务,就可以用CyclicBarrier来实现。
Semaphore,其场景主要可用于对某一资源有使用数量的限制。我们假设有一个复杂的计算任务会被很多线程调用,而该计算方法是很资源的,我们希望同时能执行的计算在一个数值内,当多个线程调用时,超过则要排队,而计算完毕后排队中的任务可以接着执行。
示例代码:
如上代码所示,我们定义了一个计算池,计算池中允许同时最多十个计算任务,要想执行计算,首先需要通过acquire来看是否有资源可用,而用后需要release资源以供后续任务使用。
输出结果如下:
可以从线程等待计算资源的时间上看出其对资源使用的限制。
Exchanger,其应用场景主要是两个线程进行数据交换。这里我们假设一个生产者消费者的情形,消费者如果手里没商品呢就把自己的容器给生产者,生产者呢生产好商品把填满的容器再给回消费者。
示例代码:
如上代码所示,我们不断的进行商品的生产与消费,从输出结果上可以看出交换的过程。
这些并发工具类相对使用会比较多,可以帮助我们解决不同应用场景下的并发调度要求。
本系列其他文章:
版权声明: 本文为 InfoQ 作者【孙苏勇】的原创文章。
原文链接:【http://xie.infoq.cn/article/96d4f3c1f8308f3d2adaad798】。文章转载请联系作者。
评论