Come posso ritardare in Java?


344

Sto cercando di fare qualcosa in Java e ho bisogno di qualcosa da attendere / ritardare per un certo numero di secondi in un ciclo while.

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

    ceva[i].setSelected(true);

    // I need to wait here

    ceva[i].setSelected(false);

    // I need to wait here

    i++;
}

Voglio costruire un sequencer step e sono nuovo di Java. Eventuali suggerimenti?


19
Usa Thread.Sleep().
Piccolo

2
Considera di utilizzare un timer
PeterMmm

2
Qual è lo scopo dell'attesa? Stai aspettando che accada un determinato evento? Assicurati di capire cosa fa il metodo sleep ()
artdanil

@Tiny, NON è sicuro.
Yousha Aleayoub,

12
In realtà lo è Thread.sleep(<milisecondsToSleep>). Non sdovrebbe essere maiuscolo.
Benjamin,

Risposte:


678

Se si desidera mettere in pausa, utilizzare java.util.concurrent.TimeUnit:

TimeUnit.SECONDS.sleep(1);

Dormire per un secondo o

TimeUnit.MINUTES.sleep(1);

Dormire per un minuto.

Poiché si tratta di un ciclo, ciò presenta un problema intrinseco: la deriva. Ogni volta che esegui il codice e poi dormi, ti allontanerai un po 'dall'esecuzione, diciamo, ogni secondo. Se questo è un problema, non utilizzare sleep.

Inoltre, sleepnon è molto flessibile quando si tratta di controllo.

Per l'esecuzione di un compito ogni secondo o un secondo di ritardo vorrei caldamente consigliare un ScheduledExecutorServiceeo scheduleAtFixedRateo scheduleWithFixedDelay.

Ad esempio, per eseguire il metodo myTaskogni 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");
}

1
@Matthew Moisen Non ho potuto ottenere questo esempio Java 8 da eseguire. Che cos'è App :: esattamente? Modificando myTask () in un lambda eseguibile funziona: Runnable myTask = () -> {...};
comfytoday

2
È un riferimento al metodo @comfytoday - suggerisco di iniziare con la documentazione .
Boris the Spider il

TimeUnit.SECONDS.wait(1)sta lanciando IllegalMonitorStateExceptionin Java 8.1 build 31 su Windows 6.3. Invece, sono in grado di utilizzare Thread.sleep(1000)senza un tentativo / cattura.
John Meyer,

1
In Java 8, in java.util.concurrent.TimeUnit ottieni Unhandled exception: java.lang.InterruptedExecutionpersleep(1)
Shai Alon

1
Devi circondare il TimeUnit.SECONDS.sleep(1);contry catch
Shai Alon il

148

Utilizzare Thread.sleep(1000);

1000 è il numero di millisecondi che il programma metterà in pausa.

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

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

12
Sono curioso di sapere cosa sia Thread.currentThread (). Interrupt (); fa qui.
Brent212,

1
vedi: "Perché dobbiamo interrompere di nuovo il thread?" qui: javaspecialists.eu/archive/Issue056.html
Tristan


5

Usa questo:

public static void wait(int ms){
        try
        {
            Thread.sleep(ms);
        }
        catch(InterruptedException ex)
        {
            Thread.currentThread().interrupt();
        }
    }

quindi puoi chiamare questo metodo ovunque come:

        wait(1000);

3

Usare TimeUnit.SECONDS.sleep(1);o Thread.sleep(1000);è un modo accettabile per farlo. In entrambi i casi devi catturare ciò InterruptedExceptionche rende ingombrante il tuo codice. Esiste una libreria java Open Source chiamata MgntUtils (scritta da me) che fornisce un'utilità che ha già a che fare con l' InterruptedExceptioninterno. Quindi il tuo codice includerebbe solo una riga:

TimeUtils.sleepFor(1, TimeUnit.SECONDS);

Vedi il javadoc qui . Puoi accedere alla biblioteca da Maven Central o da Github . L'articolo che spiega la biblioteca può essere trovato qui


2
L'uso NONcatch (InterruptedException e) { /* empty */ } è una soluzione ragionevole qui. Come minimo, è necessario fornire alcune informazioni di registro. Per ulteriori informazioni sull'argomento, consultare javaspecialists.eu/archive/Issue056.html
Marco13

3

Usa Thread.sleep(100);. L'unità di tempo è millisecondi

Per esempio:

public class SleepMessages {
    public static void main(String args[])
        throws InterruptedException {
        String importantInfo[] = {
            "Mares eat oats",
            "Does eat oats",
            "Little lambs eat ivy",
            "A kid will eat ivy too"
        };

        for (int i = 0;
             i < importantInfo.length;
             i++) {
            //Pause for 4 seconds
            Thread.sleep(4000);
            //Print a message
            System.out.println(importantInfo[i]);
        }
    }
}

1

So che questo è un post molto vecchio, ma questo può aiutare qualcuno: puoi creare un metodo, quindi ogni volta che devi mettere in pausa puoi digitare pause(1000)o qualsiasi altro valore in millisecondi:

public static void pause(int ms) {
    try {
        Thread.sleep(ms);
    } catch (InterruptedException e) {
        System.err.format("IOException: %s%n", e);
    }
}

Viene inserito appena sopra public static void main(String[] args), all'interno della classe. Quindi, per chiamare il metodo, digitare pause(ms)ma sostituire mscon il numero di millisecondi da mettere in pausa. In questo modo, non è necessario inserire l'intera istruzione try-catch ogni volta che si desidera mettere in pausa.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.