2012-03-05 100 views
0

我正在嘗試使用Java的Executors來執行多線程程序。在執行時,java線程異常終止。我通過try-catch發現了異常,但是,異常沒有消息(空)。Java線程異常終止,並帶有消息null的異常。

失敗是隨機的,但我「懷疑」失敗發生後,我已經在該線程中的函數調用發生。我試圖將線程堆棧大小增加到1024/2048,但結果保持不變。

有人可以指出在這裏採用的調試方法。因爲,我沒有關於例外的信息,我無法繼續處理它。

我在Windows 64位環境中工作,與Java 1.6

+2

請告訴我們異常類的名稱(如'NullPointerException')。堆棧跟蹤也可能有幫助。 – 2012-03-05 06:43:15

+0

您可能遇到NullPointerException。你可以在這裏發佈一部分代碼嗎? – 2012-03-05 06:43:23

+0

你可以用它來獲得堆棧跟蹤: ... catch(Exception e){e.printStackStrace();} – Sibbo 2012-03-05 07:34:02

回答

1

當使用Executors類來創建線程池使用接受的ThreadFactory的方法;示例ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory)。 在你的ThreadFactory的實現中,分配一個UncaughtExceptionHandler;示例如下

public final Thread newThread(final Runnable r) { 
    Thread newThread = threadFactory.newThread(r); // you can use default thread factory 
    newThread.setName("threadName"); 
    newThread.setDaemon(Boolean.TRUE); 
    newThread.setUncaughtExceptionHandler(new UncaughtExceptionHandler() { 
     @Override 
     public void uncaughtException(final Thread t, final Throwable e) { 
      // log 
     } 
    }); 
    return newThread; 
} 
+0

謝謝,這看起來像一個很好的編程習慣,尤其是內層子程序中未捕獲的異常。 – 2012-03-05 10:45:26

+0

以提供更多詳細信息,通過ExecutorService提交的任務被包裝到FutureTask中,該FutureTask捕獲Throwable並通過FutureTask#get()提供異常。所以這種做法真的很有道理。 – Scorpion 2012-03-05 10:48:05

+0

謝謝!還發現我們也可以從相同的FutureTask獲得超時。我一直在尋找這個,很久!謝謝!! – 2012-03-13 10:37:55