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进行测试

相关文章
相关标签/搜索