我正在使用 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 引起”之类的错误,我该如何正确完成此任务?
答案 0 :(得分:2)
当您中断在 I/O 请求中阻塞的任务时,会发生 ClosedByInterruptException
。在这种情况下,它会发生因为您在执行程序上调用 shutdownNow
。 (调用 shutdownNow
被指定为在所有仍在执行某事的执行程序的工作线程上调用 Thread.interrupt()
。)
所以……
如果您不想要例外,则不应调用 shutdownNow
。相反,调用 shutdown
并让执行程序继续当前的 Task
直到它完成。
如果您希望任务立即停止,请像当前一样调用 shutdownNow
,并重新编码 Task
对象,以便它在被中断的情况下进行复制。例如,Task
需要以适当的方式处理该异常。
鉴于您确实希望任务立即停止……问题不在于您向我们展示的代码。问题在于 Task
的代码没有正确处理中断的后果。但是我们可以告诉您如何在没有看到的情况下修复 Task
代码。