Führen Sie eine Java-Funktion nach einer bestimmten Anzahl von Sekunden aus
Lesezeit: 4 Minuten
ufk
Ich habe eine bestimmte Funktion, die nach 5 Sekunden ausgeführt werden soll. Wie kann ich das in Java machen?
Ich habe javax.swing.timer gefunden, aber ich kann nicht wirklich verstehen, wie man es benutzt. Es sieht so aus, als würde ich nach etwas suchen, das einfacher ist als diese Klasse.
Bitte fügen Sie ein einfaches Anwendungsbeispiel hinzu.
Wollen Sie 5 Sekunden warten und dann etwas ausführen oder in den 5 Sekunden mit etwas anderem weitermachen?
– Whiskysierra
13. Februar 2010 um 15:38 Uhr
Ich möchte weiterhin etwas anderes machen
– ufk
13. Februar 2010 um 15:40 Uhr
Tangens
new java.util.Timer().schedule(
new java.util.TimerTask() {
@Override
public void run() {
// your code here
}
},
5000
);
Nachdem der letzte Live-Verweis auf ein Timer-Objekt entfernt wurde und alle ausstehenden Aufgaben die Ausführung abgeschlossen haben, wird der Aufgabenausführungsthread des Timers ordnungsgemäß beendet (und wird der Garbage Collection unterzogen). Dies kann jedoch beliebig lange dauern.
Wenn Sie diesen Code ausführen, verlieren Sie Threads. Achten Sie darauf, den Timer zu löschen, wenn Sie fertig sind.
– Skaffmann
13. Februar 2010 um 15:40 Uhr
@skaffman: Ich habe eine Aussage aus dem Javadoc hinzugefügt. Müssen Sie wirklich nach dem Anrufplan aufräumen?
– Tangens
13. Februar 2010 um 15:47 Uhr
Es könnte in Ordnung sein, aber vielleicht auch nicht. Wenn Sie dieses Codefragment mehrmals ausführen, haben Sie lose Threads, die Sie nicht aufräumen können.
– Skaffmann
13. Februar 2010 um 15:51 Uhr
import java.util.Timer; import java.util.TimerTask; könnte es offensichtlicher machen, dass dies nicht der Fall ist javax.swing.Timer. / Hinweis: Wenn Sie Swing (und eigentlich AWT) verwenden, sollten Sie nichts tun, um Komponenten in Nicht-Event Dispatch Thread (EDT)-Threads zu ändern (java.util.Timer Aufgaben schlecht; javax.swing.Timer Aktionen gut).
– Tom Hawtin – Angelleine
13. Februar 2010 um 19:08 Uhr
@PaulAlexander Laut den Dokumenten – Aufruf von Timern cancel -Methode am Ende der Ausführungsmethode würde den Ausführungs-Thread der TimerTasks aufräumen.
– Dandalf
24. Februar 2018 um 21:59 Uhr
Skaffmann
Etwas wie das:
// When your program starts up
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
// then, when you want to schedule a task
Runnable task = ....
executor.schedule(task, 5, TimeUnit.SECONDS);
// and finally, when your program wants to exit
executor.shutdown();
Es gibt verschiedene andere Fabrikmethoden auf Executor die Sie stattdessen verwenden können, wenn Sie mehr Threads im Pool haben möchten.
Und denken Sie daran, dass es wichtig ist, den Executor herunterzufahren, wenn Sie fertig sind. Das shutdown() -Methode fährt den Thread-Pool sauber herunter, wenn die letzte Aufgabe abgeschlossen ist, und blockiert, bis dies geschieht. shutdownNow() wird den Thread-Pool sofort beenden.
shutdown() erlaubt nur nicht, dass neue Aufgaben eingereicht werden. shutdownNow() unterbricht auch die Tasks (nicht unbedingt sofort terminierend).
– Dan1st
25. Juni 2021 um 8:19 Uhr
Beispiel für die Verwendung javax.swing.Timer
Timer timer = new Timer(3000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
// Code to be executed
}
});
timer.setRepeats(false); // Only execute once
timer.start(); // Go go go!
Dieser Code wird nur einmal ausgeführt, und die Ausführung erfolgt in 3000 ms (3 Sekunden).
Lief wie am Schnürchen! Ich denke, das ist der effizienteste Weg.
– Noor Hossain
10. Oktober 2021 um 17:12 Uhr
hat bei mir nicht funktioniert
– Sayed Hussainullah Sadat
10. November um 10:29 Uhr
Dandalf
Als Variation von @tangens answer: Wenn Sie nicht warten können, bis der Garbage Collector Ihren Thread bereinigt, brechen Sie den Timer am Ende Ihrer run-Methode ab.
Timer t = new java.util.Timer();
t.schedule(
new java.util.TimerTask() {
@Override
public void run() {
// your code here
// close the thread
t.cancel();
}
},
5000
);
Benutzer2885850
Mein Code ist wie folgt:
new java.util.Timer().schedule(
new java.util.TimerTask() {
@Override
public void run() {
// your code here, and if you have to refresh UI put this code:
runOnUiThread(new Runnable() {
public void run() {
//your code
}
});
}
},
5000
);
camickr
Ihre ursprüngliche Frage erwähnt den “Swing Timer”. Wenn sich Ihre Frage tatsächlich auf SWing bezieht, sollten Sie den Swing-Timer und NICHT den util.Timer verwenden.
Lesen Sie den Abschnitt aus dem Swing-Tutorial über “So verwenden Sie Timer” für mehr Informationen.
birgersp
Sie könnten die Funktion Thread.Sleep() verwenden
Thread.sleep(4000);
myfunction();
Ihre Funktion wird nach 4 Sekunden ausgeführt. Dies kann jedoch das gesamte Programm anhalten …
Und es garantiert nur, dass die Ausführung nach 4 Sekunden läuft, was auch nach 10 Sekunden bedeuten könnte!
– questzen
13. Februar 2010 um 22:28 Uhr
questzen, das wirst du finden alles die Methoden hier tun das. Selbst wenn Sie etwas auf Betriebssystemebene planen, können Sie im Allgemeinen nur eine verstrichene Mindestzeit vor einem Ereignis garantieren.
– Ethan
21. März 2013 um 5:19 Uhr
Das war nicht die eigentliche Frage
– Inder R. Singh
16. Juni 2017 um 18:35 Uhr
Ich musste dies nur ablehnen – überhaupt keine Antwort auf die vorliegende Frage.
– der Mayer
24. Juli 2018 um 19:10 Uhr
OP sagte in einem Kommentar: „Ich möchte weiterhin etwas anderes machen“; dieser Code offensichtlich nicht.
– Abhijit Sarkar
2. März 2019 um 21:14 Uhr
14368300cookie-checkFühren Sie eine Java-Funktion nach einer bestimmten Anzahl von Sekunden ausyes
Wollen Sie 5 Sekunden warten und dann etwas ausführen oder in den 5 Sekunden mit etwas anderem weitermachen?
– Whiskysierra
13. Februar 2010 um 15:38 Uhr
Ich möchte weiterhin etwas anderes machen
– ufk
13. Februar 2010 um 15:40 Uhr