gpt4 book ai didi

java - 无法从 TimerTask 线程捕获异常

转载 作者:行者123 更新时间:2023-11-30 07:24:36 25 4
gpt4 key购买 nike

我有一个 Java 类,它在其主要方法中启动了一个 TimerTask,扩展 TimerTask 的类是一个内部类(类 myTimer 扩展了 TimerTask)。在它的 run 方法中,myTimer 抛出一个异常,在 main 方法中,我试图像这样捕获异常:

try {
timer.schedule(new myTimer(arg1, arg2), 0, RETRY_PERIOD);
} catch (Exception e) {
System.out.println("Exception caught");
}

但这不起作用,它永远不会捕获异常,myTimer 线程抛出。任何想法如何做到这一点?

最佳答案

您的情况有点棘手,我不确定您希望在您的代码片段中发生什么。您是否希望主线程阻塞直到计时器线程抛出异常?因为那不会发生。 try-catch 唯一要做的就是捕获调用 schedule 时发生的异常,而不是线程定期执行的代码中发生的异常。

无论如何,这都没有意义。由于计时器线程可以与主线程并行抛出异常,因此您需要定期卡住主线程以检查异常或永久卡住主线程直到计时器结束。

后一种情况可以使用 ScheduledThreadPoolExecutor 轻松完成:

ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1);
ScheduledFuture f = exec.scheduleWithFixedDelay(new Task(arg1, arg2), 0,
RETRY_PERIOD, TimeUnit.MILLISECONDS);

...
try {
f.get(); // wait for task to finish
} catch(ExecutionException ex) {
System.out.println("Exception caught");
}

其中 Task 是一个实现了 Runnable 的类。

当然,这会阻塞主线程,直到任务返回或抛出异常(这可能永远不会发生)。或者,您可以使用定时获取定期检查异常情况。

关于java - 无法从 TimerTask 线程捕获异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11448214/

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