我有点烦人的问题。现在,我有一段代码片段启动一个线程,在该线程中设置一个计时器,然后退出该线程并继续其生命。我的目的是让程序在继续代码流之前等待TimerTask完成。但是,显然,设置新的TimerTask不会暂停执行以等待定时器运行。
如何设置它以便我的代码到达TimerTask,等待TimerTask过期,然后继续?我甚至应该使用计时器吗?我到处寻找解决方案,但我似乎找不到一个。
timer = new Timer();
Thread t = new Thread(new Runnable(){
boolean isRunning = true;
public void run() {
int delay = 1000;
int period = 1000;
interval = 10;
timerPanel.setText(interval.toString());
//Scheduling the below TimerTask doesn't wait
//for the TimerTask to finish before continuing
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
timerPanel.setText(setInterval().toString());
}
}, delay, period);
System.out.println("Thread done.");
}
});
t.start();
try {
t.join(); //doesn't work as I wanted
} catch (InterruptedException e) {
e.printStackTrace();
}
endTask();
提前致谢。
编辑:对于重复任务的混乱感到抱歉。我需要重复该任务,因为它是一个倒数计时器,每秒从10脉冲到0脉冲。函数setInterval()最终取消计时器。这是相关的代码:private final Integer setInterval() {
if (interval == 1)
timer.cancel();
return --interval;
}
答案 0 :(得分:5)
我相信CountDownLatch会做你想做的事。
final CountDownLatch latch = new CountDownLatch(10);
int delay = 1000;
int period = 1000;
timerPanel.setText(Long.toString(latch.getCount()));
timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
latch.countDown();
timerPanel.setText(Long.toString(latch.getCount()));
}
}, delay, period);
try {
latch.await();
}
catch (InterruptedException e) {
e.printStackTrace();
}
timer.cancel();
答案 1 :(得分:0)
您应该使用Thread.sleep
函数而不是TimeTask
来暂停执行。
TimerTask
并不意味着停止执行,它就像一个在后台运行的时钟。因此,根据您的要求,您应该选择Thread.sleep
。
答案 2 :(得分:0)
使用信号量。在声明计时器任务之前初始化它,允许0。在计时器任务中,使用try / finally块释放信号量。在主线程中,从信号量获取许可证。
在您的代码中,join因为等待线程完成而按指定的方式工作。不,没有必要使用线程。如果你真的想要阻止一段时间,你不需要一个Timer。获取当前时间,计算毫秒直到未来时间,然后睡眠()。