Junit测试多线程无法得到结果的问题解决
class Main { public static void main(String[] args) { String trxFileDir = args[0]; String targetDir = args[1]; boolean isDecode = Boolean.parseBoolean(args[2]); ParseMojo parseMojo = new ParseMojo(trxFileDir,targetDir,isDecode); parseMojo.execute(); } }
@Test public void executeEncode() { String trxFileDir = "E:\\MAE\\code\\MyMojoParse\\src\\main\\resources\\inputFile\\"; String targetDir = "E:\\MAE\\code\\MyMojoParse\\src\\main\\resources\\outputFile\\"; boolean isEncode = true; ParseMojo parser = new ParseMojo(trxFileDir, targetDir, isEncode); parser.execute(); }
解析工具支持多线程,核心代码如下
Arrays.stream(trxFiles).forEach(trx -> PARSE_POOL.execute(() -> { convertToBinaryFile(trx); }));
猜测可能原因
首先当前问题和业务逻辑无关,初步怀疑是多线程和UT的问题,可能Junit进行测试的时候,主线程结束会导致子线程也终止。
问题排查
添加打印,查看文件的中断处
打印结果如下:
很明显,主进程结束退出的时候,子进程还没有执行完成,且每次执行到的位置不一致
问题原因
分析Junit源码
public static void main(String args[]) { TestRunner aTestRunner = new TestRunner(); try { TestResult r = aTestRunner.start(args); if (!r.wasSuccessful()) { System.exit(FAILURE_EXIT); } System.exit(SUCCESS_EXIT); } catch (Exception e) { System.err.println(e.getMessage()); System.exit(EXCEPTION_EXIT); } }
这是Junit运行的入口,我们可以发现,不管Junit测试是否成功,都会调用System.exit(),而这个方法会用来结束当前正在运行的java虚拟机。当status=0时表示正常结束,status=1表示异常退出(强制退出,程序未执行完也会退出)。JVM都关闭了,子线程还靠什么运行呢?所以这就是问题所在。
总结
在需要被测试类为多线程执行任务的时候,注意不要直接使用Junit单元测试,可能由于系统退出,导致任务异常中断。
注意要使并发工具类如 CountDownLatch、thread.join()保证任务中的线程全部执行完毕。
以上就是Junit测试多线程无法得到结果的问题解决的详细内容,更多关于Junit测试多线程无法得到结果的资料请关注脚本之家其它相关文章!
相关文章
mybatis-plus如何修改日志只打印SQL语句不打印查询结果
这篇文章主要介绍了mybatis-plus如何修改日志只打印SQL语句不打印查询结果问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2024-06-06浅谈java switch如果case后面没有break,会出现什么情况?
这篇文章主要介绍了浅谈java switch如果case后面没有break,会出现什么情况?具有很好的参考价值,希望对大家有所帮助。一起跟随想小编过来看看吧2020-09-09利用Spring Session和redis对Session进行共享详解
这篇文章主要给大家介绍了关于利用Spring、Session和redis对Session进行共享的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。2017-09-09
最新评论