public class Thread1 extends Thread {
@Override
public void run() {
super.run();
for (int i = 1; i <= 20; i+=2) {
System.out.println("i = "+i);
System.out.println(Thread.currentThread()+ " : "+i);
}
}
}
public class MultiThread {
@Test
public void test1(){
Thread1 thread1 = new Thread1();
thread1.start();
}
}
Connected to the target VM, address: '127.0.0.1:60011', transport: 'socket'
i = 1
Thread[Thread-0,5,main] : 1
Disconnected from the target VM, address: '127.0.0.1:60011', transport: 'socket'
i = 3
Thread[Thread-0,5,main] : 3
i = 5
Process finished with exit code 0
问题:启动多线程时,程序未运行完jvm进程就结束了,并且jvm是正常退出。
分析:
测试主线程能否正常输出?主线程能正常输出。 检查多线程代码是否有问题?无。 难道是idea的问题?在eclipse上跑一下,仍然是失败的。 尝试 测试类使用main方法代替test方法,多线程跑通。
深入分析原因:
junit的单元测试方法test是通过TestRunner类执行,仍是调用TestRunner的main方法,因此也可以看做是一个线程:
public static void main(String[] args) {
TestRunner aTestRunner = new TestRunner();
try {
TestResult r = aTestRunner.start(args);
if (!r.wasSuccessful()) {
System.exit(1);
}
System.exit(0);
} catch (Exception var3) {
System.err.println(var3.getMessage());
System.exit(2);
}
}
test执行结束或者出现异常,都会调用 System.exit(). System.exit()是系统调用,通知系统立即结束jvm进程的运行。 即使jvm中有线程在运行,jvm也会停止的。 因为,上述情况的返回值是Process finished with exit code 0,所以是test执行结束引起的jvm进程终止。 其中System.exit()的参数如果是0,表示系统正常退出,如果是非0,表示系统异常退出。 怀疑是在线程切换时,切回了TestRunner的main线程,继续向下执行,返回System.exit(0),导致jvm结束进程。
结论:junit4启动多线程时,会自动断开连接。应使用main方法作为多线程的测试类。
|