问题:前段时间写一个多线程的爬虫程序,要求在所有爬虫线程执行结束后,执行数据库插入操作。所以就要知道那些爬虫线程什么时候能够全部停止。
?
解决:
(1)按照以往的我的写法,我习惯用Thread类的activeCount()方法,这个方法能够返回当前线程组里活动线程的数量。比如我开5个线程,加上主线程一共是6个线程,所以只需要判断activeCount()为1时(只剩主线程),就说明其他线程都已执行完毕。
???????? 这种解决方法确实能解决一部分问题。但是当使用了一些开源框架时,比如hibernate,spring什么的,就会发现activeCount()是不可预知的,这是因为这些开源框架开了一些线程;而且在写判断是否爬虫线程都关闭的条件时要加入硬编码,所以这种解决方法就不是很好了。
?
(2)因为第一种解决方法有很多问题,所以我上网查了一下别人是怎么解决的。后来发现有CountDownLatch这个很有帮助的类。这是个同步辅助类。主要方法有三个:
?public CountDownLatch(int count); (构造方法)
?public voidclass="Apple-converted-space">?countDown();
?public void?await() throws?InterruptedException
首先,构造该类时,要传入一个int型的整数作为计数器初始值。
然后,我们可以在各个线程执行完毕时,调用countDown()方法,这个方法会把计数器减掉1。
最后,我们可以在主线程调用await(),这个方法都够阻塞当前线程(这里就是主线程),直到计数器的值减到0为止。
所以这个类给我们提供了一个方便的检测你想监测的线程是否执行完毕。
?
?