SpringBoot + CountDownLatch 模拟等待多个用户并行注册完成的功能

前言

CountDownLatch可以实现许多经典功能,也是面试中常见的技术点。

今天,我这边分享一个小案例,帮助大家理解CountDownLatch到底是做什么的。

这个案例通过伪代码实现,场景是模拟等待多个用户并行注册完成,然后管理员再审核的功能。

CountDownLatch能做什么

首先,介绍下CountDownLatch可以实现的一些场景:

1、同步线程:CountDownLatch可以使一个或多个线程等待其他线程完成特定操作后再继续执行,提供了一种简单的方式来同步线程的执行;

2、等待计数:本篇案例用到的一个场景,CountDownLatch内部维护了一个计数器,初始值由用户指定。通过调用countDown()方法,计数器的值递减,直到达到零为止。其他线程可以调用await()方法来等待计数器变为零;

3、并发控制:CountDownLatch可以用于控制多个线程之间的并发执行顺序。比如,可以让主线程等待所有子线程完成任务后再进行下一步操作;

4、定时等待:CountDownLatch提供了await(long timeout, TimeUnit unit)方法,可以设置最大等待时间。如果在指定的时间内计数器没有变为零,等待线程会被唤醒并继续执行。

小案例

我们初始化CountDownLatch,然后通过线程池执行5个异步线程完成用户注册,并且要等待5个用户都注册完成才会唤醒,最后去执行管理员审核。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

@SpringBootApplication
public class RegistrationApplication {

public static void main(String[] args) throws InterruptedException {
SpringApplication.run(RegistrationApplication.class, args);

// 假设有5个用户并行注册
int userCount = 5;
CountDownLatch latch = new CountDownLatch(userCount);

// 创建线程池,大小为用户数量
ExecutorService executorService = Executors.newFixedThreadPool(userCount);

for (int i = 0; i < userCount; i++) {
// 提交任务给线程池,并传入CountDownLatch对象
executorService.execute(new UserRegistration(latch));
}

// 等待所有用户注册完成
latch.await();

// 关闭线程池
executorService.shutdown();

System.out.println("所有用户注册完成. 管理员审核.");
}
}

执行注册的逻辑中,用户每注册一个,计数器就减-1。

class UserRegistration implements Runnable {

    private final CountDownLatch latch;

    public UserRegistration(CountDownLatch latch) {
        this.latch = latch;
    }

    @Override
    public void run() {
        try {
            // 模拟用户注册过程
            Thread.sleep((long) (Math.random() * 10000));
            System.out.println("User registered.");

            // 用户注册完成,计数器减一
            latch.countDown();

        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

这样,在主线程中调用latch.await()方法来等待所有用户注册完成,当计数器变为零时,管理员审核通过并输出相应的信息,整个闭环就完成了。

总结

本篇主要目的是让大家对CountDownLatch的几个知识点有个认识,真正工作中你不一定会使用这个玩意儿,但它确实是高频面试题,值得学习和了解一下。

希望通过这个简单的小案例,能让大家有一个印象,以后遇到能这样的面试题不会当场石化。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

missterzy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值