Junit 测试不支持多线程踩记及解决方案
2017-10-26 00:31
253 查看
背景
近来, 在用多个线程去下载多个资源文件, 用Junit测试时踩到了一个坑~涉世太浅~debug过程,发现有时只有一个线程在下载资源就结束了,其它线程还没开始就完事了~~真是奇了个怪,于是谷歌了下,发现Junit测试不支持多线程。恍然大悟, 坑有点深,以此记录,铭记于心!
下面模拟下Junit测试不支持多线程的场景.
多次执行上述程序,会发现不会打印出10行结果。Junit测试,在程勋运行完毕后,就立即把结束,才不管后台启动了多个线程在处理什么。
解决方案。
方案比较多。这里瞎歪歪几种
通过callable接口异步获取结果。交给FutureTask处理。在get值的时候当前线程会被阻塞起来。
通过CountDownLatch计数来实现
eg :
参考文献
文献1
近来, 在用多个线程去下载多个资源文件, 用Junit测试时踩到了一个坑~涉世太浅~debug过程,发现有时只有一个线程在下载资源就结束了,其它线程还没开始就完事了~~真是奇了个怪,于是谷歌了下,发现Junit测试不支持多线程。恍然大悟, 坑有点深,以此记录,铭记于心!
下面模拟下Junit测试不支持多线程的场景.
import org.junit.jupiter.api.Test; public class JunitDemo { private int i = 10; @Test public void test() { for (int i = 0; i < this.i; i ++) { new Thread(new Runner()).start(); } } class Runner implements Runnable { @Override public void run() { System.out.println("威少、安东尼、保罗乔治组成雷霆三巨头!"); } } }
多次执行上述程序,会发现不会打印出10行结果。Junit测试,在程勋运行完毕后,就立即把结束,才不管后台启动了多个线程在处理什么。
解决方案。
方案比较多。这里瞎歪歪几种
通过callable接口异步获取结果。交给FutureTask处理。在get值的时候当前线程会被阻塞起来。
通过CountDownLatch计数来实现
eg :
private int i = 10; /* * 线程计数器 * 将线程数量初始化 * 每执行完成一条线程,调用countDown()使计数器减1 * 主线程调用方法await()使其等待,当计数器为0时才被执行 */ private CountDownLatch latch = new CountDownLatch(i); @Test public void test() { for (int i = 0; i < this.i; i ++) { new Thread(new Runner()).start(); } try { latch.await(); // 主线程等待 } catch (InterruptedException e) { e.printStackTrace(); } } class Runner implements Runnable { @Override public void run() { System.out.println("威少、安东尼、保罗乔治组成雷霆三巨头!"); latch.countDown(); // 执行完毕,计数器减1 }
参考文献
文献1
相关文章推荐
- 升级Xcode到6.1之后使用iPhone6真机测试cocos2d-x报错不支持arm64的解决方案,Undefined symbols for architecture arm64 错误
- 升级Xcode到6.1之后使用iPhone6真机测试cocos2d-x报错不支持arm64的解决方案,Undefined symbols for architecture arm64 错误
- junit或maven test中无法输出被测试类中log4j的调试信息的解决方案
- Junit测试中多线程问题
- Spring MVC3.x 支持 Junit测试Action
- 升级Xcode到6.1之后使用iPhone6真机测试cocos2d-x报错不支持arm64的解决方案,Undefin ...
- 让gzip压缩速度加快的解决方案:使用支持多核CPU多线程并发压缩的pigz
- 使Junit可以测试多线程的插件:groboutils
- hiero不支持 OS X 10.7.x Lion解决方案(lion系统测试通过)
- 升级Xcode到6.1之后使用iPhone6真机测试cocos2d-x报错不支持arm64的解决方案(转)
- 使用Ant运行JUnit测试用例时,报java.lang.ClassNotFoundException: org.hamcrest.SelfDescribing的一种解决方案
- junit测试出现的小问题解决方案
- Junit测试多线程时的简单处理
- myEclipse可以main运行,不能debug,不能用Junit测试--解决方案及原因
- junit测试service,支持dubbo
- 使Junit可以测试多线程的插件:groboutils
- Junit使用GroboUtils进行多线程测试
- Junit中不能测试多线程
- Junit测试中多线程的坑
- junit测试和main方法多线程中遇到的问题