Java Timer类:如果在其中一个任务中抛出异常,则计时器任务停止执行

fic*_*ion 8 java timer

new Timer().scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
       System.out.println("run");
       throw new SomeRandomException();
    }
 }, 1000, 1000);
Run Code Online (Sandbox Code Playgroud)

输出:run(抛出异常)

问题在于:我需要一个计时器任务来检查数据库中的特定条件(或其他).它工作正常,但有时数据库(或其他)返回一些错误,抛出异常并且计时器崩溃,然后再没有执行单个计时器任务.是否有一些Timer实现在抛出异常后继续工作run().

我可以

new Timer().scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
        try {
            System.out.println("run");
            throw new SomeRandomException();
        } catch (Exception e) {
            System.out.println("dummy catch");
        }
    }
}, 1000, 1000);
Run Code Online (Sandbox Code Playgroud)

但这似乎很蹩脚.

另一种方法是编写我自己的Timer类实现,吞掉run方法的异常(这似乎也不对).

JB *_*zet 7

用一个ScheduledExecutorService.它扮演与Timer相同的角色,但修复了它的弱点(就像你遇到的那样).

  • 不幸的是,“如果任务的任何执行遇到异常,则后续执行将被抑制。” -来自http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ScheduledExecutorService.html#scheduleAtFixedRate(java.lang.Runnable, long, long, java.util.concurrent.TimeUnit) (2认同)