2014-06-08 13 views
126

Sto provando a fare qualcosa in Java e ho bisogno di qualcosa di attesa/ritardo per un numero di secondi in un ciclo while.Come ritardare in Java?

while (true) { 
    if (i == 3) { 
     i = 0; 
    } 

    ceva[i].setSelected(true); 
    //need to wait here 
    ceva[i].setSelected(false); 
    //need to wait here 
    i++; 
} 

voglio costruire uno step sequencer e io sono nuovo a Java. Eventuali suggerimenti ? Grazie!

+11

Usa 'Thread.Sleep()'. – Tiny

+0

Considera di utilizzare un [Timer] (http://docs.oracle.com/javase/7/docs/api/java/util/Timer.html) – PeterMmm

+0

Qual è lo scopo dell'attesa? Stai aspettando che accada un determinato evento? Assicurati di aver capito che metodo [sleep()] (http://docs.oracle.com/javase/tutorial/essential/concurrency/sleep.html) fa – artdanil

risposta

283

Se si desidera sospendere quindi utilizzare java.util.concurrent.TimeUnit:

TimeUnit.SECONDS.sleep(1); 

a dormire per un secondo o

TimeUnit.MINUTES.sleep(1); 

a dormire per un minuto.

Poiché questo è un ciclo, questo presenta un problema intrinseco - deriva. Ogni volta che esegui il codice e poi dormi, ti allontanerai un po 'dalla corsa, diciamo, ogni secondo. Se questo è un problema, non utilizzare sleep.

Inoltre, sleep non è molto flessibile quando si tratta di controllo.

Per l'esecuzione di un compito ogni secondo o un secondo di ritardo vorrei fortemente consigliare un ScheduledExecutorService e sia scheduleAtFixedRate o scheduleWithFixedDelay.

Ad esempio, per eseguire il metodo myTask ogni secondo (Java 8):

public static void main(String[] args) { 
    final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); 
    executorService.scheduleAtFixedRate(App::myTask, 0, 1, TimeUnit.SECONDS); 
} 

private static void myTask() { 
    System.out.println("Running"); 
} 

E in Java 7:

public static void main(String[] args) { 
    final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); 
    executorService.scheduleAtFixedRate(new Runnable() { 
     @Override 
     public void run() { 
      myTask(); 
     } 
    }, 0, 1, TimeUnit.SECONDS); 
} 

private static void myTask() { 
    System.out.println("Running"); 
} 
+0

@Matthew Moisen Non ho potuto ottenere questo esempio di Java 8 da eseguire. Che cos'è l'app :: esattamente? Cambiando myTask() con un lambda eseguibile funziona: Runnable myTask =() -> {...}; – comfytoday

+1

È un riferimento al metodo @comfytoday - Suggerisco di iniziare con [la documentazione] (https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html). –

+0

'TimeUnit.SECONDS.wait (1)' sta lanciando 'IllegalMonitorStateException' in Java 8.1 build 31 su Windows 6.3. Invece, sono in grado di usare 'Thread.sleep (1000)' senza un try/catch. –

62

uso Thread.sleep (1000);

1000 è il numero di millisecondi che il programma interromperà.

try   
{ 
    Thread.sleep(1000); 
} 
catch(InterruptedException ex) 
{ 
    Thread.currentThread().interrupt(); 
} 
+2

Non dimenticare di registrare InterruptedException o non saprai mai che questo thread è stato interrotto. – m0skit0

Problemi correlati