2

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

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

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

4

2 回答 2

2

将在与添加它的线程不同Timer的线程中执行该TimerTask.run()方法,父类将无法捕获抛出的异常的 main 方法。

一种可能的解决方案是防止异常从方法中传播出去,run()并通过某种查询方法向父级提供任何有用的信息。run()在查询结果之前,父母需要等待方法完成。

于 2012-07-12T08:59:21.257 回答
2

您的情况有点棘手,我不确定您希望在代码片段中发生什么。您是否希望主线程阻塞,直到计时器线程抛出异常?因为那不会发生。唯一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.

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

于 2012-07-12T09:47:50.653 回答