Führen Sie eine Java-Funktion nach einer bestimmten Anzahl von Sekunden aus

Lesezeit: 4 Minuten

Benutzeravatar von ufk
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

Benutzeravatar von tangens
Tangens

new java.util.Timer().schedule( 
        new java.util.TimerTask() {
            @Override
            public void run() {
                // your code here
            }
        }, 
        5000 
);

BEARBEITEN:

javadoc sagt:

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


Benutzeravatar von skaffman
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() blockiert nicht. awaitTermination() tut.

    – Yonas

    19. Mai 2021 um 11:04 Uhr

  • 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).

Wie camickr erwähnt, sollten Sie nachsehen “So verwenden Sie Swing-Timer“ für eine kurze Einführung.

  • Nur das Los, los, los! 🙂

    – Farshid Ahmadi

    17. Dezember 2020 um 13:05 Uhr

  • 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

Benutzeravatar von Dandalf
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 
);

Benutzeravatar von user2885850
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 
);

Benutzeravatar von camickr
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.

Benutzeravatar von birgersp
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


1436830cookie-checkFühren Sie eine Java-Funktion nach einer bestimmten Anzahl von Sekunden aus

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy