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

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

23
demandé sur Arón García Sánchez 2014-10-11 09:32:18

7 réponses

"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, faites pas utiliser Thread.sleep() car cela gèlera votre application Swing.

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

Voir le tutoriel Java Comment Utiliser Swing Minuteries et Leçon: la Simultanéité dans Swing pour plus d'informations et d'exemples.

18
répondu DavidPostill 2018-10-04 02:29:40

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 l'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 courant, 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.

27
répondu Oleg Mikhailov 2016-04-25 14:30:58

Vous pouvez simplement utiliser Thread.sleep() à cette fin. Mais si vous travaillez dans un environnement multithread avec une interface utilisateur, vous voulez faire cela dans le thread séparé pour éviter le sommeil de bloquer l'interface utilisateur.

try{
    Thread.sleep(60000);
    // Then do something meaningful...
}catch(InterruptedException e){
    e.printStackTrace();
}
5
répondu Aman Gautam 2014-10-11 05:42:27

N'utilisez pas Thread.sleep ou il va geler votre thread principal et ne pas simuler setTimeout à partir de 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 ceci:

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


        // your code here

    }
}.start();
3
répondu user1227168 2017-02-24 19:03:20

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
répondu Aditya Singh 2014-10-11 05:36:18
public ScheduledExecutorService = ses;
ses.scheduleAtFixedRate(new Runnable(){
    run(){
            //running after specified time
}
}, 60, TimeUnit.SECONDS);

Son exécution après 60 secondes de scheduleAtFixedRate https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledExecutorService.html

1
répondu babak 2017-06-17 16:03:49

Il existe une méthode setTimeout() dans la bibliothèqueunderscore-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 démarrée dans 100ms avec un nouveau thread.

1
répondu Valentyn Kolesnikov 2018-10-01 05:29:29