junit 多线程测试问题
2017-08-25 00:00
387 查看
最近在写测试时发现一个奇怪的问题,不废话直接上代码
这段代码会输出什么呢?
当我写这个代码的时候,我以为输出会是
1
2
3
4
5
6
1
2
3
4
...
100
那么这代码最终输出结果是什么呢?
真是的结果是:不知道,不确定。运行截图如下
很明显,不会每一次都会输出到100.总有那么几次输出不到100程序就停了。我们来改下这个代码,让输出的结果更明显。
修改后的代码,
再测试效果就很明显,不会输出到100.
如果把这段代码放在main函数里执行,每次都会执行到100.
so,结论是junit测试时不支持多线程,
why?
junit运行时代码如下
junit在实际运行时会将@test的代码执行完,然后不管有没有子线程,直接System.exit(),
junit认为此时认为已经执行完了,直接把jvm干掉了。所有,子线程也随着jvmgodead了。
如何才能让子线程也跑完呢?简单点可以直接使用Thread.join()
那么thread.join效果如何?
测试结果如下
多次测试结果均是100,
ok,基本目标实现了,
当然也可以改junit代码来实现此功能
下来看下Thread.join(),到底做了什么?
join源码如下
可以看到注释waitsforthisthreadtodie.等待直到这个线程结束
join()方法是怎么实现呢?
通过源码可以很明细的看到,join()通过调用Object类的Wait方法实现,
wait方法是需要获得此对象的锁才能执行,
所有,如果我们获取不到thread的锁,join方法会失效。
参数millis意思为:等待此线程的最大时间,0代表一直等待直到结束,通过编码预留给某个线程的最小的运行时间。
如果将测试代码Thread.join()改为Thread.join(50),此时的结果是多少呢?
此时的结果是多少呢?
经过测试,输出结果最大数大概范围为40-47,不会超过50.
结论:
在使用junit时,如果需要开线程,并且希望所有线程执行完,
此时可以考虑Thread.join()或者别使用junit测试,直接使用mian方法执行.
这段代码会输出什么呢?
当我写这个代码的时候,我以为输出会是
1
2
3
4
5
6
1
2
3
4
...
100
那么这代码最终输出结果是什么呢?
真是的结果是:不知道,不确定。运行截图如下
很明显,不会每一次都会输出到100.总有那么几次输出不到100程序就停了。我们来改下这个代码,让输出的结果更明显。
修改后的代码,
再测试效果就很明显,不会输出到100.
如果把这段代码放在main函数里执行,每次都会执行到100.
so,结论是junit测试时不支持多线程,
why?
junit运行时代码如下
junit在实际运行时会将@test的代码执行完,然后不管有没有子线程,直接System.exit(),
junit认为此时认为已经执行完了,直接把jvm干掉了。所有,子线程也随着jvmgodead了。
如何才能让子线程也跑完呢?简单点可以直接使用Thread.join()
那么thread.join效果如何?
测试结果如下
多次测试结果均是100,
ok,基本目标实现了,
当然也可以改junit代码来实现此功能
下来看下Thread.join(),到底做了什么?
join源码如下
可以看到注释waitsforthisthreadtodie.等待直到这个线程结束
join()方法是怎么实现呢?
通过源码可以很明细的看到,join()通过调用Object类的Wait方法实现,
wait方法是需要获得此对象的锁才能执行,
所有,如果我们获取不到thread的锁,join方法会失效。
参数millis意思为:等待此线程的最大时间,0代表一直等待直到结束,通过编码预留给某个线程的最小的运行时间。
如果将测试代码Thread.join()改为Thread.join(50),此时的结果是多少呢?
此时的结果是多少呢?
经过测试,输出结果最大数大概范围为40-47,不会超过50.
结论:
在使用junit时,如果需要开线程,并且希望所有线程执行完,
此时可以考虑Thread.join()或者别使用junit测试,直接使用mian方法执行.
相关文章推荐
- junit测试和main方法多线程中遇到的问题
- Junit测试中多线程问题
- Junit测试多线程的问题
- 关于JUNIT的多线程测试问题
- junit测试和main方法测试线程问题
- Junit测试spring hibernate产生javaw.exe异常的问题解决
- junit 测试问题 No qualifying bean of type [javax.servlet.http.HttpServletRequest] found for dependency
- eclipse 中使用MyBitis 创建项目时候 使用junit 测试出现找不到sqlmapconfig的问题
- Ant+JUnit+Cobertura执行测试用例时,应注意的问题(以Apache POI为例)
- maven中进行junit测试报class not found的问题
- spring3.0.2 junit 接口测试问题
- Junit 测试不支持多线程踩记及解决方案
- 关于junit测试用例数据不回滚的问题
- junit 测试问题 No qualifying bean of type [javax.servlet.http.HttpServletRequest] found for dependency
- Junit+spring+hibernate HibernateDaoSupport测试问题
- 【Java】使用Junit测试线程过程中出现的小问题
- Unity3D的Delegate和SendMessage的性能差测试,以及Delegate在多线程使用要注意的小问题
- maven中进行junit测试报class not found的问题
- 在开启多线程时,用junit测试,到连接数据库代码时,junit自动停止,而且没有报错误。
- maven spring项目 使用junit测试,出现SpringJunit4Runner的问题