Java 單元測試中的多線程無端退出

問題發現

最近在複習多線程相關知識,結果一動手就出現了問題,問題是這樣的,在單元測試中使用多線程測試,發現只要子線程在睡眠一段時間,程序就退出了,毫無徵兆!!!!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進行測試

相關文章
相關標籤/搜索