您的位置:首页 > 其它

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方法执行.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  JUnit