2016-11-02 7 views
0

Ich schreibe meine eigene Timer Klasse, die eine einzige Ausführung von TimerTask feuert. In meinem Singleton Timer gibt es private boolean isRunning. Wenn isRunning==true, werden andere Threads den Timer nicht auslösen.Wie zu entscheiden, ob java.util.Timer läuft

public class DBconnectDelayTimer extends Timer { 
    /** 
    * Indicates if the Timer is running 
    */ 
    private boolean isRunning; 
    public DBconnectDelayTimer() { 
     super(); 
     isRunning = false; 
    } 
    @Override 
    public void schedule(TimerTask task, long delay) 
     isRunning = true; 
     super.schedule(task, delay); 
    } 
    public boolean isRunning() { 
     return isRunning; 
    } 
} 

Meine Frage ist, in welchem ​​Verfahren soll ich isRunning zurück zu false?

Vielen Dank für jede Hilfe.

Antwort

0

Eine naive Lösung ist die Aufgabe Argument in einer anderen Aufgabe zu wickeln, die isRunning nach Abschluss setzt:

@Override 
public void schedule(TimerTask task, long delay) { 
    isRunning = true; 
    super.schedule(new TimerTask() { 
     @Override 
     public void run() { 
      task.run(); 
      isRunning = false; 
     } 
    }, delay); 
} 

Beachten Sie, dass dies nur funktioniert, wenn nicht mehr als eine Aufgabe zu einem Zeitpunkt geplant ist, was schwierig ist, erzwingen ohne richtige Synchronisation. Es bricht auch Timer Versprechen, eine IllegalStateException zu werfen, wenn eine einzelne Aufgabe zweimal geplant ist.

+0

Verstanden. Danke für Ihr "Beachten Sie das". – Rangtian

Verwandte Themen