在我的Java项目中,我希望每分钟都能定期完成一些事情。调查说这是用
完成的Executors.newScheduledThreadPool(1);
和
scheduler.scheduleAtFixedRate(runnable, 0, interval, MINUTES);
到目前为止,这么好。 执行的任务可能比我的间隔长度花费更多的时间。在这种情况下,新任务应该等待。我认为我通过将threadPoolSize设置为1来完成此操作,但它不起作用。当我的任务需要很长时间并且由于间隔时间结束而应该执行下一个任务时,它只是执行。
有人可以告诉我如何让新任务等待早期任务终止吗?
答案 0 :(得分:3)
根据您的要求使用Executors.newSingleThreadScheduledExecutor()
,来自其javadoc:
保证任务按顺序执行。
Timer和TimerTask是您的替代解决方案。
代码示例,"嗨"将每10秒打印一次,非1秒。
public static void main(String[] args) {
ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.scheduleWithFixedDelay(new Thr(), 0, 1, TimeUnit.SECONDS);
}
public static class Thr implements Runnable {
@Override
public void run() {
try {
Thread.sleep(TimeUnit.SECONDS.toMillis(10));
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Hi");
}
}
此解决方案可确保您不会在某处意外重新配置池。
如果使用newSingleThreadScheduledExecutor()
工厂方法而不是newScheduledThreadPool(1)
没有帮助 - 大多数情况下您可能会使用其他执行程序进行调度或类似的事情。查看您的代码,非Java执行程序或尝试提供mvce。