我想在Java中使用一个可重置时间的java.utils.Timer。我需要设置一个一次性事件在X秒内发生。如果在计时器创建和X秒之间什么都没有发生,那么事件将按正常方式发生。
但是,如果在X秒之前,我决定事件应该在Y秒后发生,那么我希望能够告诉计时器重置时间,以便事件在Y秒后发生。 例如,计时器应该能够执行以下操作:
Timer timer = new Timer();
timer.schedule(timerTask, 5000); //Timer starts in 5000 ms (X)
//At some point between 0 and 5000 ms...
setNewTime(timer, 8000); //timerTask will fire in 8000ms from NOW (Y).
使用utils计时器无法实现此操作,因为如果调用cancel()函数,则无法再次进行调度。
我找到的与其行为最接近的方法是使用javax.swing.Timer,需要停止原始计时器并创建一个新的计时器。例如:
timer.stop();
timer = new Timer(8000, ActionListener);
timer.start();
有更简单的方式吗??
TimerTask.scheduledExecutionTime()
。因此,您将无法确定该任务是否“迟到”并且不应执行。 - Jonathan SpoonermyScheduledThreadPoolExecutor.getQueue().clear()
来清除所有尚未运行的预定任务,但是对于Executors.newSingleThreadScheduledExecutor()
,您无法使用此技术。相反,您必须实例化一个new ScheduledThreadPoolExecutor(1)
,因为只有在执行器返回的对象上暴露接口方法。 - gMaleexecutor.setRemoveOnCancelPolicy(true);
。 - Mark Jeronimus