最近在複習多線程相關知識,結果一動手就出現了問題,問題是這樣的,在單元測試中使用多線程測試,發現只要子線程在睡眠一段時間,程序就退出了,毫無徵兆!!!!java
看看個人代碼(請不要拘泥這段代碼帶來的併發問題):多線程
public class ThreadTest{ class MyThread implements Runnable{ private int count = 0 ; public void run(){ try{ Thread.sleep(1000); // 子線程休眠一秒,程序都退出 }catch(InterruptedExcetption e ){ e.printStackTrace(); } while(count < 15){ count ++; System.out.println(count); } } } @Test public void threadtest(){ MyThread m1 = new MyThread(); Thread t1 = new Thread(m1); Thread t2 = new Thread(m1); Thread t3 = new Thread(m1); t1.start(); // 子線程 t2.start(); // 子線程 t3.start(); // 子線程 System.out.println(Thread.currentThread().getName()); // main 線程 }
最後查資料才發現:併發
原來這是單元測試的bug,若是把一樣的程序放在main中運行是不會出現這個問題的!單元測試
具體JUnit源碼我不知道,不過事實就是這樣:你在單元測試中打印出當前線程的名稱確實是main,測試
而後若是在單元測試中開啓了線程,這個線程若是一直處於運行狀態的話,那麼就算單元測試運行完成,spa
子線程也不會退出;線程
可是,若是子線程處於阻塞、消亡狀態,那麼單元測試會馬上中止全部的子線程,同時退出程序!code
1)使子線程不處於阻塞狀態,那麼就算單元測試運行完成,子線程也不會退出;get
2)能夠強制要求全部子線程運行完成以後,在運行主線程,以下代碼:源碼
t1.start(); // 子線程 t2.start(); // 子線程 t3.start(); // 子線程 t3.join(); // 保證全部子線程運行完成以後,才運行下面的代碼 System.out.println(Thread.currentThread().getName()); // main 線程
3)不適用單元測試測試多線程,使用main進行測試