为什么 ScheduledExecutorService 不打印堆栈跟踪?

pep*_*ito 5 java exception-handling scheduled-tasks

为什么我们在这个例子中看不到堆栈跟踪?

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您尝试对异常进行注释,您将执行 lifecheck 函数的重复任务。但是如果抛出异常,线程停止但没有细节:(

你知道为什么吗?

Mar*_*nik 1

如果你想要异常报告,你必须自己插入处理代码。ExecutorService 不会自动将异常跟踪发送到标准输出,这很好,因为这很少是我们在生产代码中需要的。

基本上,这是方法:

public void run()
{
   try {
     System.out.println("sending lifecheck ...");
     throw new RuntimeException("bang!");
   } catch (Throwable t) { t.printStackTrace(); }
}
Run Code Online (Sandbox Code Playgroud)