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.
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.
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.
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();
}
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();
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.
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
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.