问题:前段时间写一个多线程的爬虫程序,要求在所有爬虫线程执行结束后,执行数据库插入操作。所以就要知道那些爬虫线程什么时候能够全部停止。
解决:
(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为止。
所以这个类给我们提供了一个方便的检测你想监测的线程是否执行完毕。
相关推荐
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还可以执行一个回...
- **CountDownLatch**:用于计数的同步辅助类,允许一个或多个线程等待其他线程完成操作。 - **CyclicBarrier**:循环栅栏,允许多个线程同步到达一个点,然后继续执行。 - **Semaphore**:信号量,控制同时访问特定...
它是一个一次性使用的同步辅助工具,可以通过`await()`方法阻塞当前线程,直到所有计数器减到0。 - **CyclicBarrier**:让一组线程在预定义的执行点进行等待,当所有线程到达这个点时,它们会被同时释放继续执行。 -...
而 CountDownLatch 则是一种同步辅助工具,主要用来控制线程的执行顺序。CountDownLatch 中我们主要用到两个方法:await()方法和countDown()方法。await()方法的调用线程会被阻塞,而countDown()方法会使计数器减一...
- **CountDownLatch**:它是一个一次性使用的同步辅助类,用于计数。当计数器归零时,所有等待的线程会被释放。在并行计算场景中,CountDownLatch常用来确保所有子任务执行完毕后再进行下一步操作。例如,在`...