如何更新执行器时间



我正在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引起";。我怎样才能正确地完成这项任务?

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

所以。。。

  • 如果不希望出现异常,则不应该调用shutdownNow。相反,调用shutdown并让执行器继续当前的Task,直到它完成为止。

  • 如果您希望任务立即停止,请按照当前操作调用shutdownNow,并重新编码Task对象,使其能够处理被中断的。例如,Task需要处理该异常。。。以适当的方式。


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

最新更新