1. 程式人生 > 其它 >Junit測試例中使用多執行緒,輸出結果不正確

Junit測試例中使用多執行緒,輸出結果不正確

首先看如下測試例,預期結果為:1,2,3,4四個數字都會輸出

@Test
    public void testThread() {
        Thread t = new Thread() {
            @Override
            public void run() {
                logger.info("1");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    logger.error(
"",e); } logger.info("2"); }; }; Thread t2 = new Thread() { @Override public void run() { logger.info("3"); try { Thread.sleep(2000); } catch (InterruptedException e) { logger.error(
"",e); } logger.info("4"); }; }; t.start(); t2.start(); }

但真實的輸出結果為,與預期結果不一致:

11:41:43.395 [Thread-1] INFO com.demo.jkdasync.CompletableFutureDemo - 1
11:41:43.395 [Thread-2] INFO com.demo.jkdasync.CompletableFutureDemo - 3

原因為:單元測試執行時,首先建立一個當前測試例類對應的例項物件,然後呼叫存在Test註解的方法(參考Test註解中的註釋說明),這些動作也同樣是在main方法中執行的,main方法執行結束,直接推出了jvm,造成剩餘的程式碼沒有執行,如果想要執行剩餘的程式碼可以使用join或者其他執行緒同步控制器來完成,比如CountDownLatch,CyclicBarrier等,但在有些情況下,使用了這些同步器之後,和原有的邏輯則不同了,因此也不是一個好的方法,所以還需要自己在main方法中進行處理;JUnit為單元測試,只是對某一個小功能進行的測試,因此一般多執行緒這種情況也不太適合使用Junit測試。

如果要檢視junit原始碼,直接在eclipse中匯入junit,則是無法檢視原始碼的,因為原始碼無法匯入,可以通過maven下載下來所需junit包,然後手動匯入jar和原始碼即可,如果使用maven,一般原始碼也會一起下載,存在如下兩個包即可執行Junit測試

匯入原始碼:

右鍵專案-》Build Path-》Configure Build Path-》Libraries-》點開所需要新增原始碼的jar包-》選擇Sorce attachment-》在右側選擇Edit-》找到原始碼所在位置,匯入