我的应用程序中需要执行一些周期性操作,例如周期T
。目前,我使用的是 Timer.scheduleAtFixedRate(TimerTask, 0, T)。现在我想避免单个操作的重叠(在某些情况下,单个操作可能比 T
花费更多时间)。我读过 Timer
实现使用单个线程来执行操作,因此在标准情况下不会有重叠。问题是,在我的例子中,单个操作不是由传递给 Timer 的 TimerTask 直接执行的:操作仅从它开始,并且是异步执行的。 p>
因此,如果 TimerTask
执行在前一个操作完成之前启动新操作,则可能会出现重叠。相反,如果发生重叠,我想等待先前执行的终止,并在先前执行完成后立即开始新的操作。
获得这种行为的最佳实现是什么?我应该从计时器切换到其他支持吗?它是 Android 环境,所以我更喜欢 Java 标准 (util.concurrent
) 或一些基于 Android 的实现,而不是其他基于 Spring Quartz 和其他特定框架的实现。
最佳答案
您可以使用Executors.newScheduledThreadPool(1)
为了达成这个。它比 Timer{,Task}
使用起来容易得多。
关于Java - 如何避免周期性操作执行重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17445532/