web-dev-qa-db-fra.com

Comment faire un délai en Java?

J'essaie de faire quelque chose dans Java et j'ai besoin de quelque chose pour attendre/retarder une quantité de secondes dans une boucle 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++;
}

Je veux construire un séquenceur pas à pas et je suis nouveau en Java. Aucune suggestion?

281
ardb

Si vous voulez faire une pause, utilisez Java.util.concurrent.TimeUnit:

TimeUnit.SECONDS.sleep(1);

Dormir une seconde ou

TimeUnit.MINUTES.sleep(1);

Dormir une minute.

Comme il s’agit d’une boucle, cela pose un problème inhérent - la dérive. Chaque fois que vous exécutez du code, puis que vous dormez, vous vous écartez un peu, par exemple, chaque seconde. S'il s'agit d'un problème, n'utilisez pas sleep.

De plus, sleep n’est pas très flexible en matière de contrôle.

Pour exécuter une tâche toutes les secondes ou toutes les secondes, je voudrais fortement == recommander un ScheduledExecutorService et soit scheduleAtFixedRate ou - scheduleWithFixedDelay .

Par exemple, pour exécuter la méthode myTask chaque seconde (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");
}

Et dans 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");
}
563
Boris the Spider

Utilisez Thread.sleep(1000);

1000 est le nombre de millisecondes pendant lequel le programme s'interrompt.

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

Vous devez utiliser l'appel Thread.sleep().

Plus d'infos ici: http://docs.Oracle.com/javase/tutorial/essential/concurrency/sleep.html

6
Ruslan

Utilisez Thread.sleep(100);. L'unité de temps est la milliseconde

Par exemple:

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]);
        }
    }
}
3
Bachan Joseph

Je sais que c'est un article très ancien, mais cela peut aider quelqu'un: vous pouvez créer une méthode. Ainsi, chaque fois que vous devez faire une pause, vous pouvez taper pause(1000) ou toute autre valeur en millisecondes:

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

Ceci est inséré juste au-dessus de public static void main(String[] args), à l'intérieur de la classe. Ensuite, pour faire appel à la méthode, tapez pause(ms) mais remplacez ms par le nombre de millisecondes à suspendre. De cette façon, vous n'avez pas besoin d'insérer l'instruction try-catch dans son intégralité chaque fois que vous souhaitez faire une pause.

1
dominic03

Utiliser TimeUnit.SECONDS.sleep(1); ou Thread.sleep(1000); est un moyen acceptable de le faire. Dans les deux cas, vous devez attraper InterruptedExceptionqui rend votre code volumineux. Il existe une bibliothèque Open Source Java appelée MgntUtils (écrite par moi) qui fournit un utilitaire qui gère déjà InterruptedException inside. Donc, votre code ne comprendrait qu'une seule ligne:

TimeUtils.sleepFor(1, TimeUnit.SECONDS);

Voir le javadoc ici . Vous pouvez accéder à la bibliothèque depuis Maven Central ou depuis Github . L'article expliquant la bibliothèque pourrait être trouvé ici

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

    ceva[i].setSelected(true);

     try{Thread.sleep(time_in_milliseconds);}catch(InterruptedException ie){}

    ceva[i].setSelected(false);

     try{Thread.sleep(1000);}catch(InterruptedException ie){}

    i++;
}

1 seconde correspond à 1000 millisecondes.

0
purav desai

utilisez ceci:

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

alors vous pouvez appeler cette méthode n'importe où comme:

        wait(1000);
0
Hecanet