Junit测试多线程无法得到结果的问题解决

网友投稿 484 2022-10-23


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();

FQQnpXer }

}

@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);http://

} 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测试多线程无法得到结果的资料请关注我们其它相关文章!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:HTTP 之常见的状态码
下一篇:数据中心火灾频发,别让你的数据被“劫”走
相关文章

 发表评论

暂时没有评论,来抢沙发吧~