CountDownLatch是Java并发编程中的一个同步辅助类,它允许一个或多个线程等待直到一组操作完成,CountDownLatch的计数器不能被重置,因此它只能被使用一次。
以下是一个使用CountDownLatch的例子,我们将创建一个主线程,它将等待两个子线程完成数据上传任务。
1、创建CountDownLatch实例
在主线程中,我们首先创建一个CountDownLatch实例,并设置计数器的值为2,表示我们需要等待两个子线程完成任务。
CountDownLatch latch = new CountDownLatch(2);
2、创建子线程并执行任务
我们创建两个子线程,并在每个子线程中模拟数据上传任务,当每个子线程完成任务后,它们将调用CountDownLatch的countDown方法,使计数器减1。
Thread thread1 = new Thread(new Runnable() { @Override public void run() { // 模拟数据上传任务 System.out.println("线程1开始上传数据"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("线程1完成上传数据"); latch.countDown(); } }); Thread thread2 = new Thread(new Runnable() { @Override public void run() { // 模拟数据上传任务 System.out.println("线程2开始上传数据"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("线程2完成上传数据"); latch.countDown(); } }); thread1.start(); thread2.start();
3、主线程等待子线程完成任务
在主线程中,我们调用CountDownLatch的await方法,使主线程等待直到所有子线程完成任务(即计数器变为0)。
try { latch.await(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("所有线程已完成上传数据,主线程继续执行");
4、完整的示例代码
以下是完整的示例代码:
import java.util.concurrent.CountDownLatch; public class CountDownLatchExample { public static void main(String[] args) { CountDownLatch latch = new CountDownLatch(2); Thread thread1 = new Thread(new Runnable() { @Override public void run() { // 模拟数据上传任务 System.out.println("线程1开始上传数据"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("线程1完成上传数据"); latch.countDown(); } }); Thread thread2 = new Thread(new Runnable() { @Override public void run() { // 模拟数据上传任务 System.out.println("线程2开始上传数据"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("线程2完成上传数据"); latch.countDown(); } }); thread1.start(); thread2.start(); try { latch.await(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("所有线程已完成上传数据,主线程继续执行"); } }
运行上述代码,你将看到以下输出:
下面是一个关于CountDownLatch
上传数据的介绍示例。CountDownLatch
是一个多线程同步辅助类,用于允许一个或多个线程等待直到一系列操作在其他线程中执行完成。
线程/步骤 | 状态描述 | 操作内容 |
主线程 | 初始化 | 创建一个CountDownLatch 对象,设置计数器为需要完成的上传任务数 |
工作线程1 | 等待 | 等待直到主线程释放信号 |
工作线程2 | 等待 | 等待直到主线程释放信号 |
… | … | … |
工作线程N | 等待 | 等待直到主线程释放信号 |
主线程 | 通知开始 | 释放信号,允许所有工作线程开始执行上传任务 |
工作线程1 | 上传数据 | 执行数据上传操作 |
工作线程2 | 上传数据 | 执行数据上传操作 |
… | … | … |
工作线程N | 上传数据 | 执行数据上传操作 |
工作线程1 | 完成任务 | 上传完成,调用countDown() 方法减少计数器值 |
工作线程2 | 完成任务 | 上传完成,调用countDown() 方法减少计数器值 |
… | … | … |
工作线程N | 完成任务 | 上传完成,调用countDown() 方法减少计数器值 |
主线程 | 等待 | 调用await() 方法,等待直到计数器到达0 |
主线程 | 全部完成 | 当计数器到达0,表示所有上传任务完成,继续执行后续操作 |
这个介绍展示了使用CountDownLatch
进行上传数据操作的基本流程,主线程和工作线程通过CountDownLatch
对象进行同步,确保所有工作线程都完成了上传任务之后,主线程才能继续执行。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/706314.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复