无法从TimerTask线程捕获异常



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

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

其中CCD_ 4是实现CCD_。

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

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

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

最新更新