我正在用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引起”这样的错误,我该如何正确地完成这个任务呢?
发布于 2021-04-20 17:17:58
当您中断在I/O请求中被阻塞的任务时,就会发生ClosedByInterruptException。在本例中,它将会发生,因为您正在对executor调用shutdownNow。(调用shutdownNow被指定为在仍在执行某些操作的所有executor的工作线程上调用Thread.interrupt()。)
所以..。
shutdownNow。而是调用shutdown并让执行器继续执行当前的Task,直到它完成为止。shutdownNow,并重新编码Task对象,以便它在被中断时进行复制。例如,Task将需要处理该异常...以适当的方式。假设您确实希望任务现在停止...问题不在您向我们展示的代码中。问题出在Task的代码中,它没有正确处理中断的后果。但是我们可以告诉你如何修复Task代码,而不是看它。
https://stackoverflow.com/questions/67163397
复制相似问题