2012-03-05 10 views
0

JavaのExecutorsを使用してマルチスレッドプログラムを実行しようとしています。実行時に、Javaスレッドは異常終了します。 try-catchを使って例外をキャッチしましたが、例外にはメッセージがありません(null)。Javaスレッドはメッセージnullの例外で異常終了します。

失敗は、しかし、私は関数がそのスレッドに呼び出しを行った後に障害が起こっていることを「疑う」、ランダムです。スレッドのスタックサイズを1024/2048に増やそうとしましたが、結果は変わりません。

誰かがここで採用されるデバッグアプローチに指摘してくださいすることができます。以来、私は例外についての情報を持っていないので、それを進めることはできません。

ThreadFactoryを受け入れる方法を使用するスレッドプールを作成するために、エグゼキュークラスを使用している間、私は、Java 1.6

+2

( 'NullPointerException'のような)例外クラス名を教えてください。スタックトレースも役立つかもしれません。 –

+0

おそらくNullPointerExceptionが発生しています。ここにあなたのコードの一部を投稿できますか?私は呼び出されたルーチンの1スレッドのスタックトレースが、NPEで失敗したことが後で分かった –

+0

あなたは、スタックトレースを取得するには、これを使用することができますそれを殺していたのはNPEだったことは分かりませんでした。 printStackTraceはスレッドでは機能しませんでした。 – Sibbo

答えて

1

で、Windowsの64ビット環境で働いています。例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

ありがとうございます。これは、特に内層サブルーチンの捕らえられていない例外を踏まえて、うまくいくプログラミング手法のようです。 –

+0

あなたの詳細については、ExecutorServiceを介して送信されたタスクがFutureTaskにラップされ、Throwableを捕捉し、FutureTask#get()で例外を利用可能にします。この練習は本当に理にかなっています。 – Scorpion

+0

ありがとう!また、同じFutureTaskからタイムアウトを設定できることもわかりました。私はこれを、長い間探していた!ありがとう!! –

関連する問題