使用Java调度重复任务,而不会在未经检查的异常上停止

时间:2012-08-03 16:40:22

标签: java exception task timertask

我有一个非常简单的Runnable,我想安排每30秒执行一次 - 请记住,这只是这个问题的一个简单示例,而不是实际使用它的实际点。

@Override
public void run() {
    System.out.println("Throwing an unchecked exception on purpose...");
    int abc = 123 - 123;
    int def = 123 / abc;
}

我正在使用Timer和TimerTask但遇到了一个问题:每当TimerTask引发一个未经检查的异常时,该任务的任何后续执行都将被取消;因此上面的任务实际上只会运行一次,因为它会将未经检查的除法抛出0异常。

据我所知,ScheduledThreadPoolExecutor具有完全相同的“功能”,至少根据官方Java API文档“如果任务执行遇到异常,后续执行将被抑制”。

如果引发未经检查的异常,Java中是否有任何标准方法可以使Timer或ScheduledThreadPoolExecutor不抑制后续执行?

非常感谢。

1 个答案:

答案 0 :(得分:4)

  

如果引发未经检查的异常,Java中是否有任何标准方法可以使Timer或ScheduledThreadPoolExecutor不抑制后续执行?

有一种非常简单的方式 - 创建一个包含另一个<{p}}的ExceptionSuppressingRunnable

public final class ExceptionSuppressingRunnable implements Runnable
{
    private final Runnable original;

    public ExceptionSuppressingRunnable(Runnable runnable)
    {
        // TODO: Null validation
    }

    public void run()
    {
        try
        {
            original.run();
        }
        catch (RuntimeException e)
        {
            // TODO: Logging
        }
    }
}

请注意,这故意不会捕获Error(或Throwable的任何其他非异常子类)。你可以捕获Exception而不是RuntimeException - 它只会在奇怪的情况下产生影响,在这种情况下代码抛出一个已检查的异常而不声明它(由于字节码重写,版本差异)管他呢)。我认为抓住RuntimeException可能更清楚。