5

この例でスタックトレースが表示されないのはなぜですか?

public class NoStackTraceTester implements Runnable  {
    private static final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();

    private ScheduledFuture<?> lifeCheckFuture;

    @Override
    public void run() {
        lifeCheckFuture = startLifecheck();
    }

    private ScheduledFuture<?> startLifecheck()
    {
        Runnable lifeCheck = new Runnable()
        {
            @Override
            public void run()
            {
                System.out.println("sending lifecheck ...");
                throw new RuntimeException("bang!");
            }
        };
        return scheduler.scheduleAtFixedRate(lifeCheck, 1000, 1000, TimeUnit.MILLISECONDS);
    }

    public static void main(String[] args) {
        new NoStackTraceTester().run();
    }
}

例外をコメントしようとすると、lifecheck 関数の繰り返しタスクになります。しかし、例外がスローされた場合、スレッドは停止しますが、詳細はありません:(

理由はわかりますか?

4

3 に答える 3

3

ExecutorServiceは、キャプチャされたThrowableをFutureオブジェクトに配置します。これを調べると、どの例外がスローされたかを確認できます。これは必ずしも望ましいとは限らないため、run()メソッドで例外をキャッチして処理またはログに記録する必要がある場合があります。

注:例外がエスケープされると、タスクは再度繰り返されません。

Runnable lifeCheck = new Runnable() {
    @Override
    public void run() {
        try {
            System.out.println("sending lifecheck ...");
            throw new RuntimeException("bang!");
        } catch(Throwable t) {
            // handle or log Throwable
        }
    }
};
于 2012-10-15T13:18:55.773 に答える
1

例外レポートが必要な場合は、処理コードを自分で挿入する必要があります。ExecutorService は、例外トレースを標準出力に自動的に送信しません。本番コードでこれが必要になることはめったにないため、標準出力に送信されないことは非常に良いことです。

基本的に、これはアプローチです:

public void run()
{
   try {
     System.out.println("sending lifecheck ...");
     throw new RuntimeException("bang!");
   } catch (Throwable t) { t.printStackTrace(); }
}
于 2012-10-15T13:15:11.853 に答える