昨晚用Junit測試多線程,代碼如下:
private int i = 3;
@Test
public void test() {
for (int i = 0; i < this.i; i ++) {
new Thread(new Runner()).start();
}
}
class Runner implements Runnable {
@Override
public void run() {
System.out.printlun(123);
}
}
發現運行后居然沒有任何輸出…我又運行了好幾次,有時又有1~2句輸出,但是始終不全…
當時還以為程序有錯,clean了class繼續,還是一樣的,早上起來查了下百度,才明白,原來Junit只管自己的運行,是說當Junit執行完畢后,會關閉程序,不會關心是否還有自己啟動的后臺線程在運行。當Junit運行完畢后,如果后臺線程還沒有執行完畢,那么也是不會再執行了,所以出現了昨天的情況…
我始終對多線程的執行過程沒有意識呢…主線程和后臺線程的關系和執行一定要搞清楚呢…
現在既然搞清楚了,那好辦了,下面代碼展示如何優雅的將Junit主線程設置為同步線程:
private int i = 3;
/*
* 線程計數器
* 將線程數量初始化
* 每執行完成一條線程,調用countDown()使計數器減1
* 主線程調用方法await()使其等待,當計數器為0時才被執行
*/
private CountDownLatch latch = new CountDownLatch(i);
@Test
public void test() {
for (int i = 0; i < this.i; i ++) {
new Thread(new Runner()).start();
}
try {
latch.await(); // 主線程等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
class Runner implements Runnable {
@Override
public void run() {
System.out.printlun(123);
latch.countDown(); // 執行完畢,計數器減1
}
這樣改變代碼之后,一切正常了!