? ?????📝個人主頁:五敷有你? ? ??
?🔥系列專欄: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.正確實例,運行成功!!!