自学内容网 自学内容网

【SpringBoot】测试单元使用多线程

       📝个人主页:五敷有你      


 🔥系列专栏:SpringBoot
 

⛺️稳重求进,晒太阳

问题产生

今天学习了乐观锁,但在测试单元执行多线程的时候出现了问题,多线程并没有直接结果

在控制台没有任何输出结果。开始搜索问题

答案:

单元测试是不支持多线程的,因为当主线程结束以后,无论子线程结束与否,都会强制退出程序,主线程优先级最高,所以解决办法是先让子线程执行完,然后结束主线程,可以利用CountDown计数器来处理。

CountDown

概念

CountDownLatch可以使一个获多个线程等待其他线程各自执行完毕后再执行。

CountDownLatch 定义了一个计数器,和一个阻塞队列, 当计数器的值递减为0之前,阻塞队列里面的线程处于挂起状态,当计数器递减到0时会唤醒阻塞队列所有线程,这里的计数器是一个标志,可以表示一个任务一个线程,也可以表示一个倒计时器,CountDownLatch可以解决那些一个或者多个线程在执行之前必须依赖于某些必要的前提业务先执行的场景。

CountDownLatch 常用方法说明

  • CountDownLatch(int count); //构造方法,创建一个值为count 的计数器。 ​
  • await();//阻塞当前线程,将当前线程加入阻塞队列。 ​
  • await(long timeout, TimeUnit unit);//在timeout的时间之内阻塞当前线程,时间一过则当前线程可以执行, ​
  • countDown();//对计数器进行递减1操作,当计数器递减至0时,当前线程会去唤醒阻塞队列里的所有线程。

测试代码 

    CountDownLatch count=new CountDownLatch(3);
    @Resource
    UserMapper userMapper; 
@Test
    void contextLoads() throws InterruptedException {
        new Thread(()->{
            UpdateWrapper<User> wrapper1=new UpdateWrapper();
            wrapper1.set("name","John").eq("id",3);
            int update1 = userMapper.update(null, wrapper1);
            System.out.println("影响的行数"+update1);
            count.countDown();
        }).start();
        new Thread(()->{
            UpdateWrapper<User> wrapper2=new UpdateWrapper();
            wrapper2.set("name","jack").eq("id",3);
            int update2 = userMapper.update(null, wrapper2);
            System.out.println("影响的行数"+update2);
            count.countDown();
        }).start();
        new Thread(()->{
            UpdateWrapper<User> wrapper=new UpdateWrapper();
            wrapper.set("name","hu").eq("id",3);
            int update = userMapper.update(null, wrapper);
            System.out.println("影响的行数"+update);
            count.countDown();
        }).start();
        //count为0就被唤醒了
        count.await();


    }


3.正确实例,运行成功!!!


原文地址:https://blog.csdn.net/m0_62645012/article/details/136414728

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!