Junit測試多線程無法得到結(jié)果的問題解決
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); }));
猜測可能原因
首先當(dāng)前問題和業(yè)務(wù)邏輯無關(guān),初步懷疑是多線程和UT的問題,可能Junit進行測試的時候,主線程結(jié)束會導(dǎo)致子線程也終止。
問題排查
添加打印,查看文件的中斷處
打印結(jié)果如下:
很明顯,主進程結(jié)束退出的時候,子進程還沒有執(zhí)行完成,且每次執(zhí)行到的位置不一致
問題原因
分析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運行的入口,我們可以發(fā)現(xiàn),不管Junit測試是否成功,都會調(diào)用System.exit(),而這個方法會用來結(jié)束當(dāng)前正在運行的java虛擬機。當(dāng)status=0時表示正常結(jié)束,status=1表示異常退出(強制退出,程序未執(zhí)行完也會退出)。JVM都關(guān)閉了,子線程還靠什么運行呢?所以這就是問題所在。
總結(jié)
在需要被測試類為多線程執(zhí)行任務(wù)的時候,注意不要直接使用Junit單元測試,可能由于系統(tǒng)退出,導(dǎo)致任務(wù)異常中斷。
注意要使并發(fā)工具類如 CountDownLatch、thread.join()保證任務(wù)中的線程全部執(zhí)行完畢。
以上就是Junit測試多線程無法得到結(jié)果的問題解決的詳細內(nèi)容,更多關(guān)于Junit測試多線程無法得到結(jié)果的資料請關(guān)注腳本之家其它相關(guān)文章!
- 教你用IDEA配置JUnit并進行單元測試
- SpringMVC框架整合Junit進行單元測試(案例詳解)
- Springboot集成JUnit5優(yōu)雅進行單元測試的示例
- idea +junit單元測試獲取不到bean注入的解決方式
- Spring Junit單元測試加載配置文件失敗問題
- 如何在Maven項目中運行JUnit5測試用例實現(xiàn)
- Junit springboot打印測試方法信息
- Springboot使用Junit測試沒有插入數(shù)據(jù)的原因
- Spring Boot通過Junit實現(xiàn)單元測試過程解析
- Java Junit單元測試實例詳解
- SpringBoot 單元測試JUnit的使用詳解
相關(guān)文章
mybatis-plus如何修改日志只打印SQL語句不打印查詢結(jié)果
這篇文章主要介紹了mybatis-plus如何修改日志只打印SQL語句不打印查詢結(jié)果問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06如何把char數(shù)組轉(zhuǎn)換成String
這篇文章主要介紹了如何把char數(shù)組轉(zhuǎn)換成String問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02淺談java switch如果case后面沒有break,會出現(xiàn)什么情況?
這篇文章主要介紹了淺談java switch如果case后面沒有break,會出現(xiàn)什么情況?具有很好的參考價值,希望對大家有所幫助。一起跟隨想小編過來看看吧2020-09-09java?JVM方法分派模型靜態(tài)分派動態(tài)分派全面講解
這篇文章主要為大家介紹了java?JVM方法分派模型靜態(tài)分派動態(tài)分派全面講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06利用Spring Session和redis對Session進行共享詳解
這篇文章主要給大家介紹了關(guān)于利用Spring、Session和redis對Session進行共享的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09