同步辅助类CountDownLatch

问题:前段时间写一个多线程的爬虫程序,要求在所有爬虫线程执行结束后,执行数据库插入操作。所以就要知道那些爬虫线程什么时候能够全部停止。

 

解决:

(1)按照以往的我的写法,我习惯用Thread类的activeCount()方法,这个方法能够返回当前线程组里活动线程的数量。比如我开5个线程,加上主线程一共是6个线程,所以只需要判断activeCount()为1时(只剩主线程),就说明其他线程都已执行完毕。

         这种解决方法确实能解决一部分问题。但是当使用了一些开源框架时,比如hibernate,spring什么的,就会发现activeCount()是不可预知的,这是因为这些开源框架开了一些线程;而且在写判断是否爬虫线程都关闭的条件时要加入硬编码,所以这种解决方法就不是很好了。

 

(2)因为第一种解决方法有很多问题,所以我上网查了一下别人是怎么解决的。后来发现有CountDownLatch这个很有帮助的类。这是个同步辅助类。主要方法有三个:

 public CountDownLatch(int count); (构造方法)

 public void countDown();

 public void await() throws InterruptedException

首先,构造该类时,要传入一个int型的整数作为计数器初始值。

然后,我们可以在各个线程执行完毕时,调用countDown()方法,这个方法会把计数器减掉1。

最后,我们可以在主线程调用await(),这个方法都够阻塞当前线程(这里就是主线程),直到计数器的值减到0为止。

所以这个类给我们提供了一个方便的检测你想监测的线程是否执行完毕。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值