您的位置:首页 > 其它

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()  。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐