【发布时间】:2011-01-07 02:31:22
【问题描述】:
我有一个关于 Java TimerTask 的简单问题。如何根据特定条件暂停/恢复两个 TimerTask 任务?例如,我有两个在彼此之间运行的计时器。当第一个定时器的任务内部满足某个条件时,第一个定时器停止并启动第二个定时器,当第二个定时器的任务内部满足某个条件时,同样的事情发生。下面的课程正是我的意思:
public class TimerTest {
Timer timer1;
Timer timer2;
volatile boolean a = false;
public TimerTest() {
timer1 = new Timer();
timer2 = new Timer();
}
public void runStart() {
timer1.scheduleAtFixedRate(new Task1(), 0, 1000);
}
class Task1 extends TimerTask {
public void run() {
System.out.println("Checking a");
a = SomeClass.getSomeStaticValue();
if (a) {
// Pause/stop timer1, start/resume timer2 for 5 seconds
timer2.schedule(new Task2(), 5000);
}
}
}
class Task2 extends TimerTask{
public void run() {
System.out.println("Checking a");
a = SomeClass.getSomeStaticValue();
if (!a) {
// Pause/stop timer2, back to timer1
timer1.scheduleAtFixedRate(new Task1(), 0, 1000);
}
// Do something...
}
}
public static void main(String args[]) {
TimerTest tt = new TimerTest();
tt.runStart();
}
}
所以我的问题是,如何在运行timer2 时暂停timer1,反之亦然,而timer2 正在运行?性能和时间是我主要关心的问题,因为这需要在另一个正在运行的线程中实现。顺便说一句,我正在尝试在 Android 上实现这些并发计时器。
感谢您的帮助!
【问题讨论】:
-
线程“Timer-1”java.lang.IllegalStateException 中的异常:定时器已取消。
-
您可能想考虑转到
java.util.concurrent。Timer被认为有点老派。 -
我从停止/重新启动到暂停/恢复计时器进行了编辑。是否可以使用
Thread.sleep(milliseconds)? -
我意识到这只是示例代码,而您正在做更大的事情。但是在这个例子中,你不会使用两个计时器,而是一个,带有适当的 if 条件来指示在 run 方法中执行什么行为。很多时候,人们在许多计时器和许多 TimerTasks 中思考,当你只需要它时,如果你有某种需要它的周期性(一个是 20 毫秒,另一个是每 2 分钟)。即使在那种情况下,我也不会停下来,正如我在回答中所说的那样。我只想改变 run 方法的作用。当然,除非他们正在做一些对时间敏感的事情(例如,运行计时码表)。
-
Tom Hawtin,Timer old school 怎么样?我见过人们使用基于线程的概念来解决可以通过计时器轻松解决的实时问题。定时器活得很好,线程非常适合线程。
标签: java android multithreading asynchronous timer