我的情况是,我有两个并发线程,一个无法启动计时器,另一个可以停止计时器。计时器的工作方式是,一旦启动它将计数到5秒并执行一个函数,它将继续这样做,直到计时器被另一个线程停止。如何在Java中实现它。这就是我所拥有的,我觉得这是错误的做法:
请注意,sleep是一个全局volatile变量,其他两个线程打开和关闭。
void creatTime(final EventHandler handler)
{
Thread timer = new Thread()
{
public void run()
{
try
{
while(true)
{
while(sleep) Thread.sleep(1000);
//invoke function
}
}
catch(IOException e)
{
System.out.println(e);
}
}
};
timer.start();
}
}
答案 0 :(得分:4)
您可以创建TimerTask
并安排它每5秒运行一次
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
// TODO Auto-generated method stub
//Invoke your function here
}
};
//创建一个计时器并安排它
Timer timer = new Timer();
timer.scheduleAtFixedRate(timerTask, 0, 5*1000);
//要终止计时器,您可以调用其cancel
方法。
答案 1 :(得分:2)
我同意TimerTask的建议。通常,您可以将更多与线程相关的工作传递给java.util.concurrent等的更高级别的功能。例如,原始代码不处理从睡眠中提前唤醒的问题。
此外,如果睡眠变量在重新设计后仍然存在,则需要将其标记为volatile或通过synchronized get和set方法访问。有一组有限的活动可确保在一个线程中完成的写入必须对另一个线程中的读取可见。