我有一个需要每秒重复一次的while循环,我不知道该怎么做。我甚至从未使用过Java的时间模块或其他任何模块。
基本循环如下所示。谁能给我一个如何做到这一点的小费?
while (!isOver()) {
// do some work
}
答案 0 :(得分:5)
也许这段代码可以帮到你。这是一个预定的时间任务,每1秒重复一次run()方法。你可以添加你想要的任何东西。
TimerTask timerTask = new TimerTask()
{
public void run()
{
.... //Whatever inside your loop will be executed every second
}
};
....
Timer timer = new Timer();
timer.scheduleAtFixedRate(timerTask, 0, 1000);
希望它有所帮助! :)
答案 1 :(得分:2)
以下情况可以。
while (!isOver()) {
// do some work
try {
Thread.sleep(1000); /* 1000ms or 1 second */
} catch(InterruptedException e) {
// handle
}
}
答案 2 :(得分:2)
我可能会使用一个线程,虽然取决于你的计算机有多快,以及它需要为循环的每次迭代做多少工作,但它可能并不完美。
每个程序始终有一个线程。如果没有,那就不是一个过程。这是你的主线程,当你的程序启动时它会“生命”,当程序终止时会死掉。 Thread上有一个名为sleep(int ms)的静态方法。这将暂停线程的处理,直到它的参数(ms)毫秒已经过去。所以Thread.sleep(1000)将暂停该线程一秒钟,然后恢复。
每次暂停主线程一秒钟如下:
while(!isOver()) {
// Do stuff
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// Deal with exception here
}
}
希望这会有所帮助。还有另一种创建线程的方法,但是为了这个目的,它太长了并且已经抽出来了。
PS你需要try / catch,因为有时系统会中断你的线程,这会导致异常。一个简单的e.printStackTrace()可以让你知道它何时发生,但你可能想要更明确地为任何生产应用程序处理它。
答案 3 :(得分:0)
private void time() {
while (! isOver) {
try {
Thread.sleep(1000);
}
catch (InterruptedException e) {
//Do nothing, just loop
}
}
}
然后在另一个线程上启动它,这样你的主线程就会继续:
new Thread(this::time).start();
答案 4 :(得分:0)
正如您所看到的,有很多方法可以实现您的目标。这是另一种方式。如果您的代码可以抛出异常,我倾向于回避计时器,因为它会阻止Timer再次运行。像这样的东西可以减少一些问题。
ScheduledExecutorService e = Executors.newSingleThreadScheduledExecutor();
e.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
}
}, 0, 1, TimeUnit.SECONDS);
}
或者如果你想睡觉,你可以尝试:
while(!isOver) {
//DO WORK
try {
//Be careful if you are holding any Locks they will not be released
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
//Do nothing, just loop
}
}