2009-12-19 7 views
6

Ich habe diese Frage:Java: Timer und Thread erstellt

Ich habe einen Timer. Mit scheduleAtFixedRate wird eine neue Timer-Task erstellt. In dieser Timer-Aufgabe gibt es einen bestimmten Code, der eine Weile dauern kann. Wie kann ich sicherstellen, dass Timer keine neue Aufgabe erstellt, wenn die vorherige noch nicht abgeschlossen wurde?

Dank

Antwort

17

Meine Antwort wäre, Timer nicht zu verwenden, es ist veraltet. Seit Java5 wurde Timer durch die ScheduledExecutorService ersetzt, die viel flexibler und einfacher zu bedienen ist. Sie erhalten eine bessere Kontrolle darüber, wie der Scheduler funktioniert, die Art von Kontrolle, die Sie nicht mit Timer erhalten.

Sie erstellen eine mit der Fabrikklasse Executors, die eine Reihe von Factory-Methoden hat. Diejenige, die Sie bei suchen sollte ist newSingleThreadScheduledExecutor, was genau tun sollten, was Sie suchen:

Schafft ein Single-Threaded Executor , die Befehle planen können nach einer bestimmten Verzögerung ausgeführt werden, oder auszuführen regelmäßig. Tasks sind garantiert sequenziell ausgeführt werden, und nicht mehr als eine Aufgabe wird bei jeder gegebenen Zeit aktiv sein.

Mit einem ScheduledExecutorService statt Subklassifizieren TimerTask, Unterklasse Sie Runnable direkt, und dann die Aufgabe des Testamentsvollstreckers einreichen. Es gibt verschiedene Methoden auf dem Testamentsvollstrecker, müssen Sie wählen, welche für Ihre Bedürfnisse geeignet ist (die javadoc für ScheduledExecutorService sorgfältig lesen), aber der Kern ist so etwas wie dieses:

// initialise the executor 
    ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); 

    while (tasksRemaining) { 
     // create your task 
     Runnable task = ....; 
     // submit it to the executor, using one of the various scheduleXYZ methods 
     executor.schedule(task, delay, unit); 
    } 

    // when everything is finished, shutdown the executor 
    executor.shutdown(); 

Wie immer die javadoc lesen.

+0

Wenn es veraltet ist und ersetzt wurde, sollte es nicht als @deprecated markiert werden? –

+0

Meiner Meinung nach, ja, sollte es, aber Suns Regeln über die Missbilligung sind ein bisschen verwirrend. Funktional bietet "Timer"/"TimerTask" nichts über das Executor-Framework. – skaffman

+0

Könnten Sie bitte ein kleines Beispiel für die Verwendung von newSingleThreadScheduledExecutor zeigen? Ich bin neu in Java, und ich habe noch nie von Executoren gehört. Danke – Andrey

3

Die doc für die Timer class

zu jedem Timer-Objekt entspricht, ist ein einzelner Hintergrund-Thread, der verwendet auszuführen all des Timers des Aufgaben, sequentiell ist. Timer-Aufgaben sollten schnell abgeschlossen werden. Wenn ein Timer Task zu lange dauert, es "hogs" die Taskausführung des Timers Thread. Dies wiederum kann die Ausführung nachfolgender Tasks verzögern, die "bündeln" und in der Folge nacheinander ausführen können, wenn (und falls) die problematische Task schließlich abgeschlossen wird.

schlägt vor, dass es nur einen Hintergrund Thread gibt. Ich glaube also, dass dieses Szenario nicht eintreten wird.

+1

Nein, es wird immer noch die zusätzlichen Aufgaben erstellen, wenn die alte noch nicht abgeschlossen ist, sie werden einfach nicht ausgeführt, bis die erste beendet ist (und alle können sofort danach ausgeführt werden, was nicht das gewünschte Verhalten ist) . –