Java SpringBoot Test 单元测试中包括多线程时,没跑完就结束了

java,springboot,test,单元测试,包括,多线程,结束 · 浏览次数 : 192

小编点评

**解决方法:** 1. 使用 `CyclicBarrier` 来限制线程的并发数量。 2. 使用 `ExecutorService` 来创建线程池。 3. 使用 `GenericObjectPool` 来管理对象池。 4. 使用 `CountDownLatch` 来等待线程池中的所有对象被处理完。 **代码修改:** ```java @Test void basePooledTest() throws InterruptedException { AtomicInteger atomicInteger = new AtomicInteger(); int excutorCount = 15; CyclicBarrier cyclicBarrier = new CyclicBarrier(excutorCount); // 创建线程池 ExecutorService executor = Executors.newFixedThreadPool(5); // 创建对象池 MqttConnectionFactory personPoolFactory = new MqttConnectionFactory(); GenericObjectPoolConfig<MqttConnection> objectPoolConfig = new GenericObjectPoolConfig<>(); objectPoolConfig.setMaxTotal(50); // 使用对象池执行任务 for (int i = 0; i < excutorCount; i++) { executor.submit(() -> { // 模拟从对象池取出对象,执行任务 MqttConnection mqtt = null; try { mqtt = personPoolFactory.borrowObject(); mqtt.publish("Id:\" + count + "\ Time: " + DateUtil.now()); } finally { // 回收对象到对象池 if (mqtt != null) { personPoolFactory.returnObject(mqtt); } } cyclicBarrier.signal(); }); } // 等待线程池中的所有对象被处理完 cyclicBarrier.await(); executor.shutdown(); } ``` **其他提示:** * 使用 `try-finally`块来确保对象池中的对象在线程结束时被回收。 * 使用 `atomicInteger` 来确保线程之间的数据一致性。 * 使用 ` CyclicBarrier` 来限制线程的并发数量。

正文

如何阻止 Java SpringBoot Test 单元测试中包括多线程时,没跑完就结束了
使用 CountDownLatch
CountDownLatch、CyclicBarrier 使用区别
多线程 ThreadPoolTaskExecutor 应用
Java BasePooledObjectFactory 对象池化技术

@SpringBootTest
public class PoolTest {

    @Test
    void basePooledTest() throws InterruptedException {

        AtomicInteger atomicInteger = new AtomicInteger();

        int excutorCount = 15;
        CountDownLatch countDownLatch = new CountDownLatch(excutorCount);

        // =====================创建线程池=====================
        ExecutorService excutor = Executors.newFixedThreadPool(5);
        // =====================创建对象池=====================
        // 对象池工厂
        MqttConnectionFactory personPoolFactory = new MqttConnectionFactory();
        // 对象池配置
        GenericObjectPoolConfig<MqttConnection> objectPoolConfig = new GenericObjectPoolConfig<>();
        objectPoolConfig.setMaxTotal(50);
        // 对象池
        GenericObjectPool<MqttConnection> mqttPool = new GenericObjectPool<>(personPoolFactory, objectPoolConfig);
        // =====================测试对象池=====================
        // 循环100次,从线程池中取多个多线程执行任务,来测试对象池
        for (int i = 0; i < excutorCount; i++) {
            excutor.submit(new Thread(() -> {
                // 模拟从对象池取出对象,执行任务
                MqttConnection mqtt = null;
                try {
                    // 从对象池取出对象
                    mqtt = mqttPool.borrowObject();
                    // 让对象工作
                    int count = atomicInteger.addAndGet(1);
                    mqtt.publish("Id:" + count + " Time: " + DateUtil.now());
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    // 回收对象到对象池
                    if (mqtt != null) {
                        mqttPool.returnObject(mqtt);
                    }
                    countDownLatch.countDown();
                }
            }));
        }
        countDownLatch.await();
    }
}

与Java SpringBoot Test 单元测试中包括多线程时,没跑完就结束了相似的内容:

Java SpringBoot Test 单元测试中包括多线程时,没跑完就结束了

如何阻止 Java SpringBoot Test 单元测试中包括多线程时,没跑完就结束了 使用 CountDownLatch CountDownLatch、CyclicBarrier 使用区别 多线程 ThreadPoolTaskExecutor 应用 Java BasePooledObjectF

java springboot监听事件和处理事件

本文详细介绍了java springboot监听事件和处理事件的方法,为了便于广大读者理解,本文给出了两个详细的代码示例,一目了然。

Java面试题:SpringBoot异常捕获,让程序“免疫”一切错误!

在Spring Boot应用程序中,捕获全局异常是一个重要的方面,它可以帮助我们处理在应用程序运行时可能发生的各种错误情况。通过适当地捕获和处理这些异常,我们可以改善用户体验并及时采取必要的措施。

Java SpringBoot FTP 上传下载文件

POM 添加依赖 cn.hutool hutool-all 5.3.7

Java SpringBoot Bean InitializingBean 项目初始化

Spring中有两种类型的Bean,一种是普通Bean,另一种是工厂Bean,即FactoryBean。工厂Bean跟普通Bean不同,其返回的对象不是指定类的一个实例,其返回的是该工厂Bean的getObject方法所返回的对象。 ### Spring初始化bean有两种方式: - 实现Initi

如何实现 Java SpringBoot 自动验证入参数据的有效性

Java SpringBoot 通过javax.validation.constraints下的注解,实现入参数据自动验证 如果碰到 `@NotEmpty` 否则不生效,注意看下 `@RequestBody` 前面是否加上了`@Valid`

Java SpringBoot 中,动态执行 bean 对象中的方法

根据不同的条件,调用不同的 bean 对象,执行对象中的方法

Java SpringBoot 7z 压缩、解压

Java SpringBoot 7z 压缩、解压

Java SpringBoot 加载 yml 配置文件中字典项

实际项目中,如果将该类信息放配置文件中的话,一般会结合Nocas一起使用 将字典数据,配置在 yml 文件中,通过加载yml将数据加载到 Map中 Spring Boot 中 yml 配置、引用其它 yml 中的配置。# 在配置文件目录(如:resources)下新建application-xxx

Spring的Factories机制介绍

Java 的 SPI 机制 Java SpringBoot 加载 yml 配置文件中字典项 Spring的Factories就是Spring版本的Java Spi。 Spring Factories的最重要的功能就是:可以通过配置文件指定Spring容器加载一些特定的组件。 Spring Facto