2009-04-26 59 views
5

終止我有一個Runnable下面的代碼被傳遞給一個線程t:Java線程早期和可疑

public void run() { 
     logger.debug("Starting thread " + Thread.currentThread()); 

     try { 
      doStuff(); 
     } catch (Exception e) { 
     logger.debug("Exception in Thread " + Thread.currentThread()); 
     } 

     logger.debug("End of thread " + Thread.currentThread()); 
    } 

我已經打了,我看到僵局符合下列條件中的錯誤

  • 只有螺紋消息的開始已打印通過我的日誌
  • 線程轉儲表明線程t(應該被執行此)不再運行

有沒有一些神奇的方式,這個線程可能已經提前終止,但沒有記錄線程消息的結束或拋出異常?

回答

7

你確定doStuff()沒有丟掉Error?將catch (Exception e)更改爲catch (Throwable t)。有可能通過Thread.stop()殺死Java中的線程,但這是不太可能的。

+0

非常感謝。原來線程是OOMing - 因爲我沒有捕獲可丟棄的(也許其他日誌記錄被錯誤配置?),我沒有收到任何通知 – Jacob 2009-04-30 22:59:31

0

當然,線程可能會在try/catch塊結束後但在最後一條logger.debug聲明之前中斷。在那種情況下,它會拋出一個InterruptedException,原則上,它可能不會在任何地方被記錄(如果默認的異常處理程序被設置爲忽略這樣的事情)。

這似乎是一個相當不太可能發生的情況,但是......如果不知道更多關於程序其他部分的內容,很難分辨出發生了什麼。

+0

假設記錄器上可中斷的I/O。 – 2009-04-27 00:16:56

1

你確定你在哪裏開始()線程,你也加入()它事後呢?

Runnable myRunnable=new Runnable(){ 
    @Override 
    public void run(){ 
    // your original code goes here 
    } 
}; 

Thread myThread=new Thread(myRunnable); 

myThread.start(); 

myThread.join(); // magic happens here! it waits for the thread to finish ;) 

順便說一句,加入()可能拋出InterruptedException的, 所以如果東西,而它的運行, 加入將拋出這個異常通知你這個中斷你的線程。

希望這會有所幫助。

1

當你抓住Exception,你會抓住任何RunnableException任何宣佈拋出Exception,但你不會捕捉到任何擴展Error。如果你真的想抓任何的事情,那麼你需要趕上Throwable

如果你想只記錄的目的這樣做,你不關心爲什麼線程退出,你可以這樣做:

public void run() { 
    logger.debug("Starting thread " + Thread.currentThread()); 
    try { 
    // The work of your Thread 
    } finally { 
    logger.debug("End of thread " + Thread.currentThread()); 
    } 
} 

,除非線程被停止finally聲明保證執行或死鎖或以其他方式停止執行而沒有異常。

在我的大部分程序中,我安裝了一個UncaughtExceptionHandler,這樣我就可以知道每一個意外死掉的線程。這在追蹤失敗方面提供了巨大的幫助。這已添加到Java 5的語言中。

0

當你捕捉到一個普通的異常時,我建議你記錄它,以便知道異常是什麼以及它是什麼原因造成的。不這樣做根本無法幫到你。