问题:前段时间写一个多线程的爬虫程序,要求在所有爬虫线程执行结束后,执行数据库插入操作。所以就要知道那些爬虫线程什么时候能够全部停止。
解决:
(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作为一个轻量级的同步辅助类,它通过提供一种等待机制,简化了多线程操作的流程控制,有助于编写更加清晰和可维护的并发代码。在需要多个线程协同工作并确保特定执行顺序的场景中,合理地应用...
在Java并发编程中,`CountDownLatch`是一个非常实用的同步辅助类,它能够让一个或多个线程等待,直到其他线程执行完毕后再继续执行。该类位于`java.util.concurrent`包中,适用于多线程协作的场景,特别适合在需要...
Java并发工具类CountDownLatch是一种同步辅助类,允许一个或多个线程等待其他线程完成操作。CountDownLatch通过一个整数计数器来实现,在该计数器初始化后,可以通过await方法阻塞调用它的线程,直到计数器的值达到...
Java中的同步辅助类是用于控制并发执行和线程间协作的重要工具,它们提供了比`synchronized`关键字和`wait/notify`机制更为高级和灵活的同步机制。以下将详细介绍五种常用的同步辅助类: 1. **Semaphore(信号量)*...
CountDownLatch是Java并发编程中一个重要的工具类,它属于java.util.concurrent包下的一个同步辅助类。这个类的设计目的是允许一个线程等待其他多个线程完成操作,然后再继续执行。CountDownLatch通常用于多线程协作...
CountDownLatch 是一个同步的辅助类,允许一个或多个线程,等待其他一组线程完成操作,再继续执行。其原理是通过一个计数器来实现的,计数器的初始值为需要等待线程的数量。当主线程调用 CountDownLatch 的 await() ...
CountDownLatch是Java中的一种多线程同步辅助类,主要用来同步多个任务的执行。它允许一个或多个线程等待,直到一组正在其他线程中执行的操作完成。下面是对CountDownLatch的详细解释和实例代码。 CountDownLatch的...
在Java并发编程中,`CountDownLatch`是一个同步辅助类,它允许多个线程等待其他线程完成操作。在批量插入数据的场景下,可以创建一个CountDownLatch对象,初始化为线程的数量,每个线程处理完自己的数据后调用`...
CountDownLatch 是一个同步的辅助类,它可以允许一个或多个线程等待,直到一组在其它线程中的操作执行完成。它通过一个计数器来实现的,计数器的初始值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就...
这是一个对于Java CountDownLatch的简单Demo CountDownLatch一个同步辅助类 在完成一组正在其他线程中执行的操作之前 它允许一个或多个线程一直等待 用给定的计数 初始化 CountDownLatch 由于调用了 countDown 方法 ...
在本文中,我们将介绍两种重要的并发工具辅助类:CountDownLatch和CyclicBarrier。 一、CountDownLatch CountDownLatch是一种同步工具,允许一个或多个线程等待其他线程完成操作。它主要通过countDown(计数器)和...
第四章:同步辅助工具 4.1 CountDownLatch 4.2 CyclicBarrier 4.3 Semaphore 4.4 Exchanger 第五章:原子类和无锁编程 5.1 AtomicInteger与AtomicLong 5.2 AtomicReference 第六章:线程池及其应用 6.1 ...
1. `CountDownLatch`是一个同步辅助类,用于协调多个线程间的同步。 2. 它有一个不可改变的计数器(初始值),在构造时设定。 3. 每次调用`countDown()`方法,计数器减1,当计数器为0时,所有调用`await()`的线程将...
`CountDownLatch`是一个典型的同步工具类,它允许一个或多个线程等待其他线程完成操作。通常用在启动多个线程执行任务,并在所有任务完成后再继续执行后续操作的场景。`CountDownLatch`初始化时设置一个计数,每次...
8. ** CountDownLatch 计数器门**:它是一个一次性使用的同步辅助类,用于等待一组操作完成。计数器从正整数开始,每当一个线程完成其任务时,计数器减1,当计数器为零时,所有等待的线程都被释放。 9. ** ...
Java 中的 CountDownLatch 是一个同步辅助类,允许一个线程等待其他线程完成操作。它是一种非常有用的工具,用于在多线程环境中实现异步回调。在本文中,我们将学习如何使用 CountDownLatch 来完成异步回调实例,并...
1. **概念与作用**:CountDownLatch是一个同步辅助类,允许一个或多个线程等待,直到在其他线程中执行的一组操作完成为止。它本质上是一个倒计时门闩,用于控制一个线程或者多个线程的等待与继续执行。 2. **使用...
4. **CountDownLatch**:这是一个一次性使用的同步辅助类,用于让一组线程等待其他线程完成操作。在批量处理中,主线程可能使用CountDownLatch来等待所有子线程完成任务,然后继续执行后续操作。 5. **...
`CyclicBarrier`是另一个同步辅助类,允许一组线程等待其他线程到达屏障点再继续执行。在`Demo_CyclicBarrier.java`中,我们可以看到如何设定屏障点,所有线程必须到达此点才能继续。CyclicBarrier还可以执行一个回...
Java中的CyclicBarrier是一个同步辅助类,用于使一组线程互相等待,直到所有线程都达到了某个公共屏障点,然后它们才能继续执行。这个概念中的“Cyclic”一词表明这个屏障是循环使用,允许重复利用的。CyclicBarrier...