问题:前段时间写一个多线程的爬虫程序,要求在所有爬虫线程执行结束后,执行数据库插入操作。所以就要知道那些爬虫线程什么时候能够全部停止。
解决:
(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为止。
所以这个类给我们提供了一个方便的检测你想监测的线程是否执行完毕。
相关推荐
利用 CountDownLatch 类实现线程同步,而不用回调机制。详见我的博文 http://blog.csdn.net/kroclin/article/details/37956949
本篇文章主要介绍了Java中多线程同步类 CountDownLatch的相关知识,具有很好的参考价值。下面跟着小编一起来看下吧
java并发工具类(CountDownLatch+Semaphore+Exchanger);java并发工具类(CountDownLatch+Semaphore+Exchanger);java并发工具类(CountDownLatch+Semaphore+Exchanger);java并发工具类(CountDownLatch+...
3.2 使用CountDownLatch实现同步 主线程等待多个线程完成 4.1 场景介绍 4.2 使用CountDownLatch实现等待 CountDownLatch的其他应用场景 5.1 倒计时计时器 5.2 同时开始任务 5.3 等待多个资源就绪 CountDownLatch与...
主要介绍了Java线程并发工具类CountDownLatch原理及用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要为大家详细介绍了CountDownLatch的使用说明,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
这是一个对于Java CountDownLatch的简单Demo CountDownLatch一个同步辅助类 在完成一组正在其他线程中执行的操作之前 它允许一个或多个线程一直等待 用给定的计数 初始化 CountDownLatch 由于调用了 countDown 方法 ...
《java并发编程》中CountDownLatch和CyclicBarrier用法实例大全,几乎包含了所有重要的用法
在网上找的一个CountDownLatch的学习demo,感觉很不错,就摘抄过来了
递减锁存器CountDownLatch的使用以及注意事项!
目录 CountDownLatch是什么? CountDownLatch如何工作? 在实时系统中的应用场景 应用范例 常见的面试题 代码样例
主要介绍了Java中CountDownLatch进行多线程同步详解及实例代码的相关资料,需要的朋友可以参考下
主要介绍了如何使用CountDownLatch同步java多线程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
mybaits 多线程 实现数据批量插入 (运用CountDownLatch实现闭锁) 1、mybatis批处理 2、数据分批量查询 3、数据分批量插入
CountDownLatch与thread.join()的区别
CountDownLatch Demo
JUC常用辅助类 CountDownLatch (减少计数器) CyclicBarrier(加法计数器) Semaphore(信号量,流量控制) ReentrantReadWriteLock (读写锁) BlockingQueue(阻塞队列) 线程池 池化技术 线程池的优势 线程池的...
NULL 博文链接:https://cpjsjxy.iteye.com/blog/2272451
CountDownLatch、Semaphore等4大并发工具类详解,并介绍了简单的适用场景。
CountDownLatch是一个同步工具类,它通过一个计数器来实现的,初始值为线程的数量。每当一个线程完成了自己的任务,计数器的值就相应得减1。当计数器到达0时,表示所有的线程都已执行完毕,然后在等待的线程就可以恢复...