web-dev-qa-db-fra.com

Quel est l'équivalent de javascript setTimeout en Java?

J'ai besoin d'implémenter une fonction à exécuter après 60 secondes de clic sur un bouton. S'il vous plaît, aidez-moi, j'ai utilisé la classe Timer, mais je pense que ce n'est pas la meilleure façon.

29

"J'ai utilisé la classe Timer, mais je pense que ce n'est pas la meilleure façon."

Les autres réponses supposent que vous n'utilisez pas Swing pour votre interface utilisateur (bouton).

Si vous utilisez Swing, n'utilisez pas Thread.sleep() car cela gèrera votre application Swing.

À la place, vous devez utiliser un javax.swing.Timer.

Voir le Java tutorial How to Use Swing Timers and Lesson: Concurrency in Swing for more information and examples.

19
DavidPostill

Implémentation asynchrone avec JDK 1.8:

public static void setTimeout(Runnable runnable, int delay){
    new Thread(() -> {
        try {
            Thread.sleep(delay);
            runnable.run();
        }
        catch (Exception e){
            System.err.println(e);
        }
    }).start();
}

Pour appeler avec une expression lambda:

setTimeout(() -> System.out.println("test"), 1000);

Ou avec référence de méthode:

setTimeout(anInstance::aMethod, 1000);

Pour gérer le thread en cours d'exécution, utilisez uniquement une version synchrone:

public static void setTimeoutSync(Runnable runnable, int delay) {
    try {
        Thread.sleep(delay);
        runnable.run();
    }
    catch (Exception e){
        System.err.println(e);
    }
}

Utilisez ceci avec prudence dans le thread principal - il suspendra tout après l'appel jusqu'à ce que timeout expire et runnable s'exécute.

32
Oleg Mikhailov

Vous pouvez simplement utiliser Thread.sleep() à cet effet. Mais si vous travaillez dans un environnement multithread avec une interface utilisateur, vous souhaitez effectuer cette opération dans le thread séparé pour éviter que le sommeil ne bloque l'interface utilisateur.

try{
    Thread.sleep(60000);
    // Then do something meaningful...
}catch(InterruptedException e){
    e.printStackTrace();
}
6
Aman Gautam

Utilisez Java 9 CompletableFuture, chaque simple:

CompletableFuture.delayedExecutor(5, TimeUnit.SECONDS).execute(() -> {
  // Your code here executes after 5 seconds!
});
5
user1079877

Ne pas utiliser Thread.sleep ou il gèlera votre thread principal et ne simulera pas setTimeout depuis JS. Vous devez créer et démarrer un nouveau thread d'arrière-plan pour exécuter votre code sans arrêter l'exécution du thread principal. Comme ça:

new Thread() {
    @Override
    public void run() {
        try {
            this.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }


        // your code here

    }
}.start();
3
Juliano Moraes
public ScheduledExecutorService = ses;
ses.scheduleAtFixedRate(new Runnable(){
    run(){
            //running after specified time
}
}, 60, TimeUnit.SECONDS);

son exécution après 60 secondes à partir de scheduleAtFixedRate https://docs.Oracle.com/javase/7/docs/api/Java/util/concurrent/ScheduledExecutorService.html

1
babak

Vous devez utiliser la méthode Thread.sleep().

try {

    Thread.sleep(60000);
    callTheFunctionYouWantTo();
} catch(InterruptedException ex) {

}

Cela attendra 60 000 millisecondes (60 secondes), puis exécutera les instructions suivantes dans votre code.

1
Aditya Singh

Il existe une méthode setTimeout() dans la bibliothèque nderscore-Java .

Exemple de code:

import com.github.underscore.U;
import com.github.underscore.Function;

public class Main {

    public static void main(String[] args) {
        final Integer[] counter = new Integer[] {0};
        Function<Void> incr = new Function<Void>() { public Void apply() {
            counter[0]++; return null; } };
        U.setTimeout(incr, 100);
    }
}

La fonction sera lancée dans 100 ms avec un nouveau thread.

1

Utilisation de Java.util.Timer :

new Timer().schedule(new TimerTask() {
    @Override
    public void run() {
        // here goes your code to delay
    }
}, 300L); // 300 is the delay in millis

Ici vous pouvez trouver quelques informations et exemples.

0
Luca Pinelli