如何更新执行程序时间?

时间:2021-04-19 13:55:23

标签: java schedule executor

我正在使用 Java 开发 executorService。如果时间未到,必须更新执行器延迟并删除旧的。`

Duration timeFromLast = Duration.between(this.lastTime, LocalDateTime.now());
Duration check = Duration.ofMillis(100);
Duration durationTillCheck = check.minus(timeFromLast);
if(durationTillCheck.toMillis()<0)
{
    if(!executor.isShutdown())//
    {
        executor.shutdownNow();
        executor = Executors.newSingleThreadScheduledExecutor();
    }
    executor.schedule(Task, 100, TimeUnit.MILLISECONDS);
}

但有时会出现“由 ClosedByInterruptException 引起”之类的错误,我该如何正确完成此任务?

1 个答案:

答案 0 :(得分:2)

当您中断在 I/O 请求中阻塞的任务时,会发生 ClosedByInterruptException。在这种情况下,它会发生因为您在执行程序上调用 shutdownNow。 (调用 shutdownNow 被指定为在所有仍在执行某事的执行程序的工作线程上调用 Thread.interrupt()。)

所以……

  • 如果您不想要例外,则不应调用 shutdownNow。相反,调用 shutdown 并让执行程序继续当前的 Task 直到它完成。

  • 如果您希望任务立即停止,请像当前一样调用 shutdownNow,并重新编码 Task 对象,以便它在被中断的情况下进行复制。例如,Task 需要以适当的方式处理该异常。


鉴于您确实希望任务立即停止……问题不在于您向我们展示的代码。问题在于 Task 的代码没有正确处理中断的后果。但是我们可以告诉您如何在没有看到的情况下修复 Task 代码。

相关问题