【发布时间】:2010-06-23 17:38:18
【问题描述】:
根据我的阅读,ScheduledExecutorService 似乎是在 Java 中启动和停止计时器的正确方法。
我需要移植一些启动和停止计时器的代码。这不是一个周期性定时器。此代码在启动计时器之前停止计时器。因此,实际上每次启动实际上都是一个restart()。我正在寻找使用 ScheduledExecutorService 执行此操作的正确方法。这是我想出的。寻找 cmets 并了解我所缺少的东西:
ScheduledExecutorService _Timer = Executors.newScheduledThreadPool(1);
ScheduledFuture<?> _TimerFuture = null;
private boolean startTimer() {
try {
if (_TimerFuture != null) {
//cancel execution of the future task (TimerPopTask())
//If task is already running, do not interrupt it.
_TimerFuture.cancel(false);
}
_TimerFuture = _Timer.schedule(new TimerPopTask(),
TIMER_IN_SECONDS,
TimeUnit.SECONDS);
return true;
} catch (Exception e) {
return false;
}
}
private boolean stopTimer() {
try {
if (_TimerFuture != null) {
//cancel execution of the future task (TimerPopTask())
//If task is already running, interrupt it here.
_TimerFuture.cancel(true);
}
return true;
} catch (Exception e) {
return false;
}
}
private class TimerPopTask implements Runnable {
public void run () {
TimerPopped();
}
}
public void TimerPopped () {
//Do Something
}
tia, 卢布
【问题讨论】:
-
编写的代码无法编译:startTimer() 中的 _batchTimer 未在任何地方声明。如果您可以更详细地了解预期行为会很有帮助:startTimer 和 stopTimer 的返回值是什么?为什么你想让 start/stopTimer 潜在地阻塞调用?
-
@Sbodd,当我开始一个计时器时,如果已经有一个计时器正在运行,我想停止它,这样我就不会同时弹出两个计时器。我认为不是那里的 get(),我只需要在未来的实例上调用 cancel()。
标签: java multithreading design-patterns timer executorservice