令仔学多线程系列----同步工具类CountDownLatch
Posted 令仔很忙
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了令仔学多线程系列----同步工具类CountDownLatch相关的知识,希望对你有一定的参考价值。
简单介绍 |
简单的介绍下CountDownLatch,是在jdk1.5被引入的,是在java.util.concurrent
包下,它允许一个或者多个线程一直等待,直到其他线程的操作执行完后再执行。
CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量,下面代码中的count
就是初始时设置的线程数量。也就是闭锁需要等待的线程数量。这个值只能被设置一次,而且CountDownLatch没有提供任何机制去重新设置这个计数值。
public CountDownLatch(int count) ...
CountDownLatch在主线程启动了设置的线程之后,需要立即调用CountDownLatch.await(),这样主线程的操作就会在这个地方阻塞,知道设置的线程完成各自的任务。
public void await() throws InterruptedException
sync.acquireSharedInterruptibly(1);
有一点需要注意的就是,如果你给某一个东西上了锁,那么你怎么着也得有开锁的时候吧,CountDownLatch也可以当成一把锁来看,所以再每执行完一个线程之后,你都要去开一下锁,就是调用CountDownLatch.countDown()方法。
public void countDown()
sync.releaseShared(1);
目的就是为了你上了10把锁,每执行完一个任务就去解开一把锁,要不然就会一直锁着,线程就会一直阻塞在这个地方。countDown()方法就是开锁的,每调用一次这个方法,count值就会减一,直到为0,主线程就能通过await()
,回复执行自己的任务。
举个应时的场景 |
假如我是一个供货的中间代理商,我从供货商那里拿到货然后销售给平台。所有供应商的货物的报价在我这经过处理,每种物品选择一个最低的报价显示在平台上,薄利多销嘛。
如果平台来了一个search请求,我总不能一个供货商一个供货商的去查询吧,查询供应商的数据库还需要时间的,而平台要求的search返回时间肯定不希望太长。而且我最终还有把查到的价格做处理,这些都是时间,时间就是Money。
怎么办?在这里我可以应用CountDownLatch。
上图中有五个供货商,就设置count数量为5,然后异步发送search请求消息,await一段时间(<平台要求的一次search返回时间),然后把所有的价格统计再进行后期处理。
final CountDownLatch countDownLatch = new CountDownLatch(5);
for (int i=0;i<5;i++)
new Thread(new Runnable()
@Override
public void run()
//调用不同的供应商
countDownLatch.countDown(); //每new 一个Thread记得要减一。
).start();
try
countDownLatch.await(10000, TimeUnit.MILLISECONDS); //等待10秒(<小于平台要求的返回时间)
//后续处理
catch (InterruptedException e)
e.printStackTrace();
先简单的介绍到这里,后期会对CountDownLatch再做深入的研究。
以上是关于令仔学多线程系列----同步工具类CountDownLatch的主要内容,如果未能解决你的问题,请参考以下文章