ScheduledExecutorService 超时后结束

Nik*_*rov 0 java scheduled-tasks java-threads

再会!我有调度程序,我需要检查它的工作时间。我怎样才能做到这一点?当调度程序工作超过 5 分钟时,我需要从 someFunction() 返回错误

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

public int someFunction() {
    ScheduledFuture<Integer> future = 
        scheduler.schedule(new ScheduledPrinter(), 10, TimeUnit.SECONDS);
    if (scheduler.isShutdown()) {
        return future.get();
    }
}
private class ScheduledPrinter implements Callable<Integer> {
    public Integer call() throws Exception {
        // do something
        if (!serverResponse.getErrorData().equals("QueueIsNotReady")) {
            scheduler.shutdown();
            return getResponse();
        } 
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

hoa*_*oaz 5

您可以使用以下选项:

  1. scheduler.awaitTermination(5, TimeUnit.MINUTES)

    ScheduledFuture<Integer> future = 
            scheduler.schedule(new ScheduledPrinter(), 10, TimeUnit.SECONDS);
    if (!scheduler.awaitTermination(5, TimeUnit.MINUTES)) {
        throw new Exception("task did not complete");
    } 
    
    Run Code Online (Sandbox Code Playgroud)
  2. future.get(5, TimeUnit.MINUTES). 此方法允许您将调度程序重用于其他任务:

    ScheduledFuture<Integer> future =
            scheduler.schedule(new ScheduledPrinter(), 10, TimeUnit.SECONDS);
    future.get(5, TimeUnit.MINUTES)); // this will throw TimeoutException after 5 minutes
    
    Run Code Online (Sandbox Code Playgroud)
  3. 安排另一个任务在 5 分钟内运行,以检查第一个任务状态。该方法可用于超时的异步处理。someFunction在这种情况下将立即返回:

    ScheduledFuture<Integer> future =
            scheduler.schedule(new ScheduledPrinter(), 10, TimeUnit.SECONDS);
    scheduler.schedule(() -> {
        if (!future.isDone()) {
            future.cancel(true);  // cancel task if it runs more than 5 minutes
        }
    }, 5, TimeUnit.MINUTES);
    
    Run Code Online (Sandbox Code Playgroud)