📝个人主页:五敷有你
🔥系列专栏: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);@ResourceUserMapper userMapper;
@Testvoid 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.正确实例,运行成功!!!