2009-11-18 20 views
1

出現問題。我有一個派生的線程,必須調用它的finally塊。假設下面的代碼,是否有可能確保最終在runnable中被調用?確保runnig終於在產生的線程,當spawner命中RuntimeException?

import org.junit.Test; 

public class ThreadTest { 
    @Test 
    public void testThreadFinally() throws InterruptedException { 
     Runnable r = new Runnable() { 
      @Override 
      public void run() { 
       try { 
        System.out.println("Going to sleep...");      
        Thread.sleep(1000); 
        System.out.println("slept 1000 ms"); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } finally { 
        System.out.println("Must print this."); 
       } 
      } 
     }; 
     Thread t = new Thread(r); 
     t.setDaemon(false); 
     t.start(); 
     Thread.sleep(500); 
     System.out.println("main thread about to throw runtime..."); 
     throw new RuntimeException("fail"); 
    } 
} 

回答

1

WFM也。但在命令行中沒有jUnit進行測試。可能與此有關。也許jUnit會關閉運行測試的虛擬機,當發生意外的錯誤時。您是否嘗試添加

@Test (expected=RuntimeException.class) 

到方法。

或者,如果你在一個main(..) { }塊在控制檯上運行時,運行相同的代碼

輸出的JUnit在這種情況下不表現

Going to sleep... 
main thread about to throw runtime... 
Exception in thread "main" java.lang.RuntimeException: fail 
     at Test.main(Test.java:22) 
slept 1000 ms 
Must print this. 
+0

是的,多數民衆贊成,認爲我再造了另一個問題,但這是一個死衚衕......謝謝 – Tomas 2009-11-18 20:18:33

1

據我所知,終於不會運行的唯一方法是如果你的主線程調用System.exit()。

+0

掛上, 如果我將它作爲Junit測試運行,我不會得到最後的結果。我懷疑Junit正在做一個system.exit().... – Benj 2009-11-18 16:57:34

+0

是的,證實。 JUnit在捕獲正在關閉JVM的運行時異常之後調用system.exit()。 – Benj 2009-11-18 17:03:22

1

如果您的測試工具在1000毫秒內完全運行,您將永遠無法看到最終消息,因爲JVM已關閉。

0

您的問題,幾乎可以肯定是由於在運行此JUnit,這將導致調用System.exit()。正如你所寫的,你的Runnable保證在它退出之前執行它的最終阻塞。調用後不能退出的唯一途徑是:

  • 方法本身
  • 過程無限循環退出由於某些線程調用System.exit()(可能了Runnable本身)。
  • Java進程被外部強制終止(例如,通過Unix的kill命令)。
相關問題