2011-12-21 216 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

相關問題