项目场景:
java数据
问题描述:
在main方法中能够正常的运行,在Test测试类就无法执行
@Override
class MyThread_1 implements Runnable {
private int count = 10;
// 覆写run()方法,作为线程 的操作主体
public void run() {
System.out.println("1、进入run()方法");
while (count > 0) {
// 线程的休眠,在 test_ThreadSleep 演示的时候使用
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "运行" + "count=" + this.count--);
}
}
}
//测试类
public class TestDemo {
@Test
public void test_ThreadSleep() {
MyThread_1 mt = new MyThread_1();// 实例化Runnable子类对象
Thread t = new Thread(mt, "线程"); // 实例化Thread对象
t.start(); // 启动线程
}
}
//输出结果
/*
1、进入run()方法
* */
原因分析:
- 在测试类中测试,系统对线程进行启动后,就代表执行完这一行了,接着进行下一行的执行,知道结束,然后main函数会调用system.exit(0)结束整个正序。不管启动的线程时候执行完。
- 而在main函数中进行测试,系统会在所有进程执行结束之后才会调用 system.exit(0) 关闭程序
- system.exit(0)是系统调用的,通知系统立即结束jvm的运行,即使jvm中有线程在运行,jvm也会停止。
解决方案:
- 在主线程中使用Thread.sleep(),延时时间要超过所有与子线程的执行时间。
Thread.sleep(30000);
- 使用Thread.join(),对线程强制执行(目前我是用这个,但是不知道为什么?)。
thread.join();
@Test
public void test_ThreadSleep() throws Exception {
MyThread_1 mt = new MyThread_1();// 实例化Runnable子类对象
Thread thread = new Thread(mt, "线程"); // 实例化Thread对象
thread.start(); // 启动线程
// 如果想要在junit中开启线程,必须要让主线程在其他线程执行完成后才结束,为什么?
// 答:@Test不会等待其他线程结束再去结束程序,只要 @Test执行完成,那么这个程序也就结束了。而在main方法中运行时会区分子线程是否是守护线程
//
// Thread.sleep(30000); // 加入延时,能够保证子线程在其结束之前完整就行。
thread.join(); // join是对线程的强制执行,也是可以的。而不用让主线程在哪里闲着,等待所有线程结束。但是总感觉哪里会出现问题,奇怪!!!为何?
}