簡體   English   中英

當一個任務引發異常時,如何獲取ScheduledExecutorService來繼續執行其他后續任務

[英]How do i get ScheduledExecutorService to keep executing other subsequent tasks when one task throws an exception

我有一個執行器,每5秒執行一次任務

public class ScheduledTaskExecutor {

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

}

這是任務。 如果X == 4我拋出IllegalArgumentException

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

}

程序停止執行,並且不打印堆棧跟蹤。

此行為是根據ScheduledExecutorService#scheduleAtFixedRate.的javadoc進行的ScheduledExecutorService#scheduleAtFixedRate. 解決該問題的一種方法是捕獲可運行的所有異常。

這個答案有更多詳細信息https://stackoverflow.com/a/24902026/3002471

  1. 實現ScheduledExecutorService接口(SESWrrapper),該接口在其構造函數中接受另一個ScheduledExecutorService。
  2. 實現Runnable接口(SafeRunnableWrapper),該接口在其構造函數中接受另一個Runnable,並在其run()方法內部捕獲異常。
  3. 如上所述實現Callable接口(SafeCallableWrapper)。
  4. 在SESWrrapper。(Runnable,long,TimeUnit)中,方法使用SafeRunnableWrapper包裝Runnable並調用嵌套的ScheduledExecutorService.schedule()。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM