gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 02:50:07 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com