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

标签 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();
    }
}

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

你知道为什么吗?

最佳答案

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
        }
    }
};

关于java - 为什么 ScheduledExecutorService 不打印堆栈跟踪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12896351/

相关文章:

java - 将批处理作为计划任务的混淆问题

java - 如何在java代码中安排任务

java - 减少开关的案例数

java - Android CoordinatorLayout anchor 故障与键盘

java - Java中的递归Chudnovsky算法

exception - Camel : onException vs. 拦截SendToEndpoint

powershell - (PowerShell) 记录异常并继续(Active Directory 模块)

c# - 为什么 BinaryFormatter 会尝试将标记为 [Serializable] 的类型的对象转换为 IConvertible?

mysql - 计划命令如何使用DB查询正确获取数据库信息

java - 正则表达式过滤联系人号码