Junit测试含有‘启动新线程’这一操作的方法时瞬间结束的问题
2018-04-02 15:35
309 查看
@Test public void task1(){ final long timeInterval = 1000; Runnable runnable=new Runnable() { @Override public void run() { while(true){ System.out.println("Hello !!"); try { Thread.sleep(timeInterval); } catch (Exception e) { e.printStackTrace(); } } } }; Thread thread=new Thread(runnable); thread.start(); }可是这段测试代码,不管怎么运行,运行多少次,它的运行结果却怎么也不是想像中的结果,却是如下的结果:
从结果看来,Hello!!只输出了一次,而我们是想让它每秒输出一次。
对这个结果很是意外,到底是为什么呢?于是找了度娘,找到如下的一段说明:在多线程环境下,程序退出的条件是,所有的非Daemon线程都正常结束或者某个线程条用了system.exit方法,导致进程强行退出。在eclipse下运行Junit的类是org.eclipse.jdt.internal.junit.runner.RemoteTestRunner。通过查看这个类的main方法。如下:
public static void main(String [] args) {
try {
RemoteTestRunner testRunServer= new RemoteTestRunner();
testRunServer.init(args);
testRunServer.run();
} catch (Throwable e) {
e.printStackTrace(); // don't allow System.exit(0) to swallow exceptions
} finally {
// fix for 14434
System.exit(0);
}
}
显然,只要主线程结束,整个程序将会退出,这就是采用junit的时候奇怪退出程序的原因。 看到这段,也就明白了上面的结果了。为了避免上面的这种情况,我想出来的两种方法:① 不使用Junit来测试,而是自己写个main方法来进行测试;public static void main(String[] args) {
final long timeInterval = 1000;
Runnable runnable=new Runnable() {
@Override
public void run() {
while(true){
System.out.println("Hello !!");
try {
Thread.sleep(timeInterval);
} catch (Exception e) {
e.printStackTrace();
}
}
}
};
Thread thread=new Thread(runnable);
thread.start();
}运行结果如下:
② 还使用JUnit,但在测试代码的最后加上sleep语句,即如下代码的最后的 sleep那样:@Test
public void task1(){
final long timeInterval = 1000;
Runnable runnable=new Runnable() {
@Override
public void run() {
while(true){
System.out.println("Hello !!");
try {
Thread.sleep(timeInterval);
} catch (Exception e) {
e.printStackTrace();
}
}
}
};
Thread thread=new Thread(runnable);
thread.start();
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}运行结果如下:
但是这样的话,必须要正确估算出需要进行sleep的时间。 或者干脆使用不指定时间的sleep() 。
相关文章推荐
- Junit测试含有‘启动新线程’这一操作的方法时瞬间结束的问题
- junit测试和main方法测试线程问题
- Junit 测试中新启动线程问题
- 子线程中循环操作UI线程时导致子线程无法正常结束的问题总结
- JAVA学习7_Eclipse操作_生成方法、接口、Junit测试类_定制视图、New选项_Tomcat服务器_Jar包
- linux启动程序和结束程序相关问题解决方法
- C#中关于线程启动运行带多参数方法的操作
- 线程间操作无效: 从不是创建控件“”的线程访问它~~~的解决方法~ 线程间操作无效: 从不是创建控件“Control Name'”的线程访问它问题的解决方案及原理分析
- his测试 junit原来不能用的问题解决方法 及 eclipse开发加速小技巧 (from victor)
- 记一个使用Junit测试中的问题:The import junit cannot be resolved解决方法
- junit测试中方法不运行问题所在
- Spring注解编程时用junit测试时,显示jdK版本过低问题,更改版本后仍然不行的解决方法
- 在main方法中启动TestNG测试时build path的问题
- 在使用win 7 无线承载网络时,启动该服务时,有时会提示:组或资源的状态不是执行请求操作的正确状态。 网上有文章指出,解决这个问题的方法是在设备管理器中启动“Microsoft托管网络虚拟适配
- JAVAEE-junit测试hibernate里的方法(hibernate交给spring管理)的问题
- junit测试和main方法多线程中遇到的问题
- 黑马程序员-解决系统报错“线程间操作无效: 从不是创建控件" txtbox1" 的线程访问它”问题的方法
- java单元测试junit测试线程问题
- 1多线程的概述2多线程(创建多个线程实例,并启动多个线程)的实现方式,main主方法是单线程的4多线程的实现方式5多线程模拟火车站售票出现问题7线程的声明周期
- 编写多线程代码时,启动线程后等待线程结束方法