如何将 while 循环延迟到 1 秒间隔,而不会将其运行的整个代码/计算机减慢到 1 秒延迟(只是一个小循环)。
问问题
106808 次
4 回答
35
Thread.sleep(1000); // do nothing for 1000 miliseconds (1 second)
于 2011-12-21T07:05:05.313 回答
12
似乎您的循环在主线程上运行,如果您sleep
在该线程上执行,它将暂停应用程序(因为只有一个线程已暂停),为了克服这个问题,您可以将此代码放入Thread
并行运行的新代码中
try{
Thread.sleep(1000);
}catch(InterruptedException ex){
//do stuff
}
于 2011-12-21T07:03:44.040 回答
5
我延迟循环的简单方法。
在未能遵循 stackoverflow 的标准后,我已经将代码放在这里。
//1st way: Thread.sleep : Less efficient compared to 2nd
try {
while (true) {//Or any Loops
//Do Something
Thread.sleep(sleeptime);//Sample: Thread.sleep(1000); 1 second sleep
}
} catch (InterruptedException ex) {
//SomeFishCatching
}
//================================== Thread.sleep
//2nd way: Object lock waiting = Most efficient due to Object level Sync.
Object obj = new Object();
try {
synchronized (obj) {
while (true) {//Or any Loops
//Do Something
obj.wait(sleeptime);//Sample obj.wait(1000); 1 second sleep
}
}
} catch (InterruptedException ex) {
//SomeFishCatching
}
//=============================== Object lock waiting
//3rd way: Loop waiting = less efficient but most accurate than the two.
long expectedtime = System.currentTimeMillis();
while (true) {//Or any Loops
while(System.currentTimeMillis() < expectedtime){
//Empty Loop
}
expectedtime += sleeptime;//Sample expectedtime += 1000; 1 second sleep
//Do Something
}
//===================================== Loop waiting
于 2015-11-05T15:28:34.970 回答
1
正如 Jigar 所指出的,您可以使用另一个线程来完成可以独立于其他线程运行、睡眠等的工作。该类java.util.Timer
也可能对您有所帮助,因为它可以为您执行定期任务,而无需您进行多线程编程。
于 2011-12-21T07:23:59.437 回答