我正在嘗試使用Java的Executors來執行多線程程序。在執行時,java線程異常終止。我通過try-catch發現了異常,但是,異常沒有消息(空)。Java線程異常終止,並帶有消息null的異常。
失敗是隨機的,但我「懷疑」失敗發生後,我已經在該線程中的函數調用發生。我試圖將線程堆棧大小增加到1024/2048,但結果保持不變。
有人可以指出在這裏採用的調試方法。因爲,我沒有關於例外的信息,我無法繼續處理它。
我在Windows 64位環境中工作,與Java 1.6
我正在嘗試使用Java的Executors來執行多線程程序。在執行時,java線程異常終止。我通過try-catch發現了異常,但是,異常沒有消息(空)。Java線程異常終止,並帶有消息null的異常。
失敗是隨機的,但我「懷疑」失敗發生後,我已經在該線程中的函數調用發生。我試圖將線程堆棧大小增加到1024/2048,但結果保持不變。
有人可以指出在這裏採用的調試方法。因爲,我沒有關於例外的信息,我無法繼續處理它。
我在Windows 64位環境中工作,與Java 1.6
當使用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;
}
謝謝,這看起來像一個很好的編程習慣,尤其是內層子程序中未捕獲的異常。 – 2012-03-05 10:45:26
以提供更多詳細信息,通過ExecutorService提交的任務被包裝到FutureTask中,該FutureTask捕獲Throwable並通過FutureTask#get()提供異常。所以這種做法真的很有道理。 – Scorpion 2012-03-05 10:48:05
謝謝!還發現我們也可以從相同的FutureTask獲得超時。我一直在尋找這個,很久!謝謝!! – 2012-03-13 10:37:55
請告訴我們異常類的名稱(如'NullPointerException')。堆棧跟蹤也可能有幫助。 – 2012-03-05 06:43:15
您可能遇到NullPointerException。你可以在這裏發佈一部分代碼嗎? – 2012-03-05 06:43:23
你可以用它來獲得堆棧跟蹤: ... catch(Exception e){e.printStackStrace();} – Sibbo 2012-03-05 07:34:02