2011-12-21 11 views
11

Come faccio a ritardare un ciclo while ad intervalli di 1 secondo senza rallentare l'intero codice/computer su cui è in esecuzione fino ad un secondo (solo un piccolo loop).Java Delay/Wait

+0

_without rallentare l'intero _codice elaborare questa –

+0

@JigarJoshi Sto cercando di ritardare questo ciclo while ad intervalli di 1 secondo per il mio plugin di Minecraft. Ma la maggior parte dei metodi di attesa sospendono l'intero server per il tempo impostato, piuttosto che solo il ciclo –

+0

si desidera l'esecuzione del ciclo while per un determinato periodo di tempo e quindi di nuovo in un ritardo fisso. –

risposta

24

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

+0

Questo non mette in pausa l'intero script/computer? –

+2

Ciò interromperà solo quel particolare thread in cui è in esecuzione questo codice. il tuo computer non verrà congelato –

11

Sembra che il tuo loop gira su Main thread e se fai sleep su quel thread metterà in pausa l'app (dato che c'è solo un thread che è stato messo in pausa), per superare questo puoi mettere questo codice nel nuovo Thread che corre parallelamente

try{ 

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

funziona perfettamente – ERJAN

1

Come Jigar ha indicato è possibile utilizzare un altro thread di fare un lavoro che può funzionare, dormire ecc indipendentemente da altri thread. La classe java.util.Timer potrebbe aiutarti anche perché può eseguire attività periodiche per te senza dover accedere alla programmazione con multithreading.

2

I miei semplici modi per ritardare un ciclo.

Ho già inserito i codici qui dopo aver omesso di seguire gli standard dello 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

Mi piace il terzo modo, perché può inibire un intero core della CPU e nessuno lo chiamerebbe mai un odore di codice. – Tom