等待Java中的计时器完成


问题内容

我正在使用java.util.Timer安排定期任务。有一次,我想将其关闭,然后
等待它完成

Timer.cancel()将阻止将来运行任何任务。如何确保当前没有任何任务在运行(或者正在等待,请耐心等待)?

我可以介绍外部同步机制,但看不到它们如何涵盖所有情况。例如,如果我在任务中的某些Monitor上进行同步,则我仍然会错过任务刚刚开始执行但没有使用Monitor的情况。

等待所有任务(包括当前正在运行的任务)真正完成之前的推荐做法是什么?


问题答案:

您最好使用ScheduledExecutorService而不是Timer来安排您的定期任务。ScheduledExecutorService提供了一个shutdown()方法,该方法将执行所有待处理的任务。然后,您可以调用awaitTermination()以等待shutdown()完成。