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.
"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.
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.
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();
}
Utilisez Java 9 CompletableFuture, chaque simple:
CompletableFuture.delayedExecutor(5, TimeUnit.SECONDS).execute(() -> {
// Your code here executes after 5 seconds!
});
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();
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
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.
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.
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.