Java ScheduledExecutorService 运行 一个 CPU 核心处于 100%(但不执行任务)

Java ScheduledExecutorService running one CPU core at 100% (but not executing a task)

我正在使用以下方法创建执行程序:

    executor = Executors.newScheduledThreadPool(0, (r) -> new Thread(r, "Scheduler"));

我正在安排 2 个任务,每个 运行ning 一次,然后每天间隔一次

  long seconds = Duration.between(now, s.scheduledRunTime).getSeconds();
  if (seconds <= 0) {
    seconds += TimeUnit.DAYS.toSeconds(1);
  }

  LOG.info("Scheduling " + s.target + " to run immediately and then every day at " + s.scheduledRunTime + " (first " + seconds + " seconds from now)");
  executor.execute(() -> execute(s));
  executor.scheduleAtFixedRate(() -> execute(s), seconds, TimeUnit.DAYS.toSeconds(1), TimeUnit.SECONDS);

这些任务正确地执行了它们的初始 运行,我可以在日志中看到它们在合理的时间范围内开始和完成。 (一个需要 39 秒,一个需要 16 秒)。

如果我等待时间,任务也会正确地执行它们预定的运行。

在我的 Windows 开发环境(来自 Eclipse 的 JavaSE-1.8 (jdk1.8.0_45))上一切正常,但是一旦部署到 Linux 运行在 Java 1.8 上运行。0_40 我看到名为 Scheduler 的线程永久地以 100% CPU 旋转。

我没有尝试关闭调度程序(研究表明在关闭期间有时会发生这种情况,但这里不是这种情况)。

堆栈跟踪是:

Thread[Scheduler,5,app] RUNNABLE
CPU (msecs) = 15020099
java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.poll(ScheduledThreadPoolExecutor.java:809)
java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1066)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
java.lang.Thread.run(Thread.java:745)

有谁知道是什么导致此线程使用 100% CPU 旋转?

我试过多次刷新,但堆栈跟踪从未显示除上述以外的任何内容。

你的代码没问题;我怀疑您遇到问题是因为您使用了 0 个核心线程(newScheduledThreadPool 的第一个参数)。

Java 8 中有一个已知错误,它描述了 this issue。 JDK 9 修复了这个特定的错误。错误报告的另一条评论表明该问题未在 8u45(您的工作环境版本)上重现,因此我建议您先升级 JDK - 我相信这会解决您的问题。