2011-12-21 98 views
11

如何将一个while循环延迟到1秒的时间间隔,而不会减慢它运行到一秒钟延迟的整个代码/计算机(只是一个小循环)。Java延迟/等待

+0

_without拖慢整个code_阐述这个 – 2011-12-21 07:05:10

+0

@JigarJoshi我想在我的Minecraft插件间隔1秒延迟这个while循环。但大多数等待方法会暂停整个服务器达到设定的时间,而不仅仅是循环 – 2011-12-21 07:08:15

+0

,您希望执行while循环一段固定的时间,然后再以固定的延迟时间执行。 – 2011-12-21 07:08:58

回答

24

Thread.sleep(1000); // do nothing for 1000 miliseconds (1 second)

+0

这不会暂停整个脚本/电脑吗? – 2011-12-21 07:06:06

+2

这只会暂停该代码运行的特定线程。你的电脑不会被冻结 – 2011-12-21 07:07:45

11

看来你的循环运行在主线程,如果你在该线程做sleep将暂停应用程序(因为只有一个线程已暂停),要克服这一点,你可以把新的Thread这个代码,平行

try{ 

    Thread.sleep(1000); 
}catch(InterruptedException ex){ 
    //do stuff 
} 
+0

这个作品完美 – ERJAN 2014-01-04 07:51:23

1

运行作为Jigar曾表示,你可以使用另一个线程来独立于其他线程的执行,可运行工作,睡眠等。 java.util.Timer类也可以帮助你,因为它可以为你执行定期任务,而无需进入多线程编程。

2

我简单的方法来延迟一个循环。

我已经把代码放在这里后,没有遵循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 
+0

我喜欢第三种方式,因为它可以禁止整个cpu核心,并且没有人会称此为代码异味。 – Tom 2015-11-05 16:36:50