我正在使用以下方法创建遗嘱执行人:
executor = Executors.newScheduledThreadPool(0, (r) -> new Thread(r, "Scheduler"));
我安排了两个任务,每个任务运行一次,然后每天间隔一次
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\u 45))上,一切都很好,但是一旦部署到运行在Java 1.8.0\u 40上的Linux上,我就会看到名为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旋转吗?
我尝试过多次刷新,堆栈跟踪只显示上述内容。