用Junit测试简单的线程出现了问题求解答

coffeesweet 2015-08-14 03:22:46
我写了个模拟接水的代码,有Water、Student,其中student是线程,代码你们看看

public class Water {

public void flowWater(String studentName){
System.out.println("开始为"+studentName+"流水");
try {
Thread.sleep(3000);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("结束为"+studentName+"流水");
}
}
public class Student extends Thread{

private String studentName;
private Water water;
public Student(String studentName,Water water){
this.studentName=studentName;
this.water=water;
}
public void receiveWater(){
System.out.println(studentName+"从教室跑向饮水机");
water.flowWater(studentName);
System.out.println(studentName+"跑回教室");

}
public void run(){
receiveWater();
}
}


这是测试类

import org.junit.Test;

public class TestWater {

public static void main(String[] args) {
Water water=new Water();
Student s1=new Student("小常",water);
Student s2=new Student("小尚",water);
Student s3=new Student("小王",water);
Student s4=new Student("小刘",water);

s1.start();
s2.start();
s3.start();
s4.start();
}
@Test
public void TestWater(){
Water water=new Water();
Student s1=new Student("小常",water);
Student s2=new Student("小尚",water);
Student s3=new Student("小王",water);
Student s4=new Student("小刘",water);

s1.start();
s2.start();
s3.start();
s4.start();

}
}


然后用Junit测试,结果测试方法TestWater的结果和main方法执行的结果不一样
...全文
248 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhuangqingch 2015-08-15
  • 打赏
  • 举报
回复
引用 5 楼 向云的回复:
大神你这么牛,帮忙看下我的问题呗,求帮助!!!!
已经回复
zhuangqingch 2015-08-15
  • 打赏
  • 举报
回复
引用 6 楼 coffeesweet的回复:
引用 4 楼 zhuangqingch 的回复:
可是第二张junit的话就一直卡在那,不知道为何:那是程序已经结束啦,不是卡在那。具体可以看下Junit的那个进度条,全绿了就是执行完了。
好深奥,一知半解的,但是谢谢你了啊!回答的那么详细!
等你对java学习到一定程度时,你可以回过头来,再来看看这一个帖子,还是会有所帮助的,到那时你对junit能够动态测试代码的原理,会产生更多的求知欲,能触发你去看junit的源码就跟赞了,哈哈,说得夸张了点
向云 2015-08-15
  • 打赏
  • 举报
回复
大神你这么牛,帮忙看下我的问题呗,求帮助!!!!
coffeesweet 2015-08-15
  • 打赏
  • 举报
回复
引用 4 楼 zhuangqingch 的回复:
可是第二张junit的话就一直卡在那,不知道为何:那是程序已经结束啦,不是卡在那。具体可以看下Junit的那个进度条,全绿了就是执行完了。
好深奥,一知半解的,但是谢谢你了啊!回答的那么详细!
zhuangqingch 2015-08-14
  • 打赏
  • 举报
回复
可是第二张junit的话就一直卡在那,不知道为何:那是程序已经结束啦,不是卡在那。具体可以看下Junit的那个进度条,全绿了就是执行完了。
zhuangqingch 2015-08-14
  • 打赏
  • 举报
回复
可是第二张junit的话就一直卡在那,不知道为何???
zhuangqingch 2015-08-14
  • 打赏
  • 举报
回复
这个跟Junit的运行机制有关,Junit你可以理解为也是一个java程序,且是一个独立的程序。
当你用Junit执行一个方法,它的大概操作过程是:
1、启动Junit程序
2、启动过程中会将你要测试的“目标类”及“方法”传递过Junit程序。
3、Junit根据信息解析出目标类class文件路径。
4、动态加载class文件,加载成内存中的一个java对象。利用反射(具体可以百度下)调用目标方法。

Junit执行目标方法的方式是。当方法执行完成后,会立即结束程序。像楼主写的TestWater方法,由于使用了4个线程。
所以会出现方法执行完了,线程可能还没跑完。但Junit不会管这些子线程是否运行完,就直接结束程序了。
所以才会有了楼主看到的现象。

具体你可以查看下Junit的源码:junit.textui.TestRunner这个类。
关键代码如下图:




有不懂的,欢迎追问!
coffeesweet 2015-08-14
  • 打赏
  • 举报
回复


第一张是main方法的,正常
可是第二张junit的话就一直卡在那,不知道为何???

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧