当一个任务引发异常时,如何获取ScheduledExecutorService来继续执行其他后续任务

时间:2019-01-26 09:45:43

标签: java concurrency executorservice

我有一个执行者,每5秒执行一次任务

public class ScheduledTaskExecutor {

  public int execute(){
    ScheduledExecutorService executor = Executors.newScheduledThreadPool(4);
    executor.scheduleAtFixedRate(new Task().run,3,5, TimeUnit.SECONDS);
    return -1;
  }

}

这是任务。如果IllegalArgumentException

,我会抛出X == 4
public class Task {

    private static final Logger LOG = LoggerFactory.getLogger(DcEmailTask.class);
    private int x = 0;


    public Runnable run = () -> {
        String currentThread = Thread.currentThread().getName();
        x++;
        System.out.println("Thread [" + currentThread + "] is executing the task: " + x);
        if (x == 4) throw new IllegalArgumentException();
    };

}

程序停止执行,并且没有打印堆栈跟踪。

2 个答案:

答案 0 :(得分:0)

此行为是根据ScheduledExecutorService#scheduleAtFixedRate.的javadoc来解决的,一种方法是在runnable中捕获所有异常。

此答案有更多详细信息,https://stackoverflow.com/a/24902026/3002471

答案 1 :(得分:0)

  1. 实现ScheduledExecutorService接口(SESWrrapper),该接口在其构造函数中接受另一个ScheduledExecutorService。
  2. 实现Runnable接口(SafeRunnableWrapper),该接口在其构造函数中接受另一个Runnable,并在其run()方法内部捕获异常。
  3. 实现上述可调用接口(SafeCallableWrapper)。
  4. 在SESWrrapper中。(Runnable,long,TimeUnit)方法用SafeRunnableWrapper包装Runnable并调用嵌套的ScheduledExecutorService.schedule()。