Ist es in Java möglich einen laufenden Timer abbrechen?

vfl_freak

Premium-User
Hallo zusammen,

in meiner (Swing-)Anwendung verwende ich einen javax.swing.timer.

ich habe mittlerweile festgestellt, dass ein Abbruch mitten im zugehörigen Code-Block nicht möglich ist. Wenn ich ihn von 'außerhalb' stoppe, werde ja noch alle Aktionen bis zum Ende des Codeblocks ausgeführt, ehe sich der Stop-Aufruf auswirkt (oder anders ausgedrückt: ein timer.stop() verhindert "lediglich" das erneute Ausführen).

Ich habe mir mittlerweile auch mal die API zum TimerTask zu Gemüte geführt, habe es aber so verstanden, dass hier ein timer.cancel() den gleichen Effekt hat, richtig ?

Kennt jemand eine andere Möglichkeit oder einen Trick, dieses Abbrechen zu bewerkstelligen?

Gruß
Klaus
 
Moin,

erstmal Danke für die Antwort :)

Ich denke nicht, dass das mein Problem löst :rolleyes:

Hier vlt. noch der Code des Timers, der abgebrochen werden soll
Code:
/**
   * Haupt-Zeitschleife, hier werden alle zyklisch ablaufenden Aktionen gestartet
   */
public Timer MainTimer = new Timer( TIMER_INTERVALL, new ActionListener() 
{
    public void actionPerformed( ActionEvent evt ) 
    {
        // Hier laufen jetzt bis zu 10 verschiedene Aktion (DB-Zugriffe etc.) ab.
        // Trotzdem soll quasi möglich sein, von außen gesteuert (durch MainTimer.stop()|cancel() oder so)
        // mittendrin (also etwa nach der 5. Aktion den aktuellen Timer-Durchlauf zu unterbrechen/abzubrechen ....
        .....
    }
} );

Gruß
Klaus
 
ich habe noch nie etwas damit gemacht, aber wenn du einen boolean setzt und diesen als ifbedingung nimmst, dann sollte es doch gehen.

Code:
private boolean isTimerTaskAllowed;
public Timer MainTimer = new Timer( TIMER_INTERVALL, new ActionListener() 
{
    public void actionPerformed( ActionEvent evt ) 
    {
      if (isTimerTaskAllowed) {
//              dbabfrage
      }
//      if (isTimerTaskAllowed) {
//              dbabfrage2
// wenn es immer getestet werden soll, sonst nur eine ifbedingung
//      }
    }
} );
 
was mir grad noch einfällt, mit:

eine methode mit einer while-schlife welche in einem neuen thread gestartet wird, allerdings find ich die lösung nicht so gut
 
Moin Maik,

ich habe noch nie etwas damit gemacht, aber wenn du einen boolean setzt und diesen als ifbedingung nimmst, dann sollte es doch gehen.
Code:
private boolean isTimerTaskAllowed;
public Timer MainTimer = new Timer( TIMER_INTERVALL, new ActionListener() 
{
    public void actionPerformed( ActionEvent evt ) 
    {
      if (isTimerTaskAllowed) {
//              dbabfrage
      }
//      if (isTimerTaskAllowed) {
//              dbabfrage2
// wenn es immer getestet werden soll, sonst nur eine ifbedingung
//      }
    }
} );

hmm, ok, das wäre mal eine Idee, um zumindest den Ablauf zu beschleunigen :-)
Werde das mit meinem Chef mal diskutieren und dann testen ...

Erst nochmal Danke :-)
Gruß
Klaus
 
Hallo Klaus,

sry, war eben ein bissi in eile, kam sicher recht unhöflich rüber... sry dafür.
Was möchtest du denn genau machen? ich kenne die klasse nicht, macht der timertask etwas eine bestimmte zeit lang oder zu einem bestimmten zeitpunkt?
Und falls ich dir schon geholfen habe, dann freut mich das auch

mfg,

Maik
 
Hallo Maik,

sry, war eben ein bissi in eile, kam sicher recht unhöflich rüber... sry dafür.
nö, wieso? War doch alles ok :-)

Was möchtest du denn genau machen? ich kenne die klasse nicht, macht der timertask etwas eine bestimmte zeit lang oder zu einem bestimmten zeitpunkt?
Und falls ich dir schon geholfen habe, dann freut mich das auch

Hier mal ein teil der API - bevor ich noch Blödsinn erzähle :-D :
Fires one or more ActionEvents at specified intervals. An example use is an animation object that uses a Timer as the trigger for drawing its frames.

Setting up a timer involves creating a Timer object, registering one or more action listeners on it, and starting the timer using the start method. For example, the following code creates and starts a timer that fires an action event once per second (as specified by the first argument to the Timer constructor). The second argument to the Timer constructor specifies a listener to receive the timer's action events.

int delay = 1000; //milliseconds
ActionListener taskPerformer = new ActionListener() {
public void actionPerformed(ActionEvent evt) {
//...Perform a task...
}
};
new Timer(delay, taskPerformer).start();

Timers are constructed by specifying both a delay parameter and an ActionListener. The delay parameter is used to set both the initial delay and the delay between event firing, in milliseconds. Once the timer has been started, it waits for the initial delay before firing its first ActionEvent to registered listeners. After this first event, it continues to fire events every time the between-event delay has elapsed, until it is stopped.

Es wird also alle x Sekunden ein Event gefeuert, das veranlasst, dass alles, was in actionPerformed steht, ausgeführt wird. Wird nun während dieser Ausführungszeit irgendwo Timer.stop aufgerufen (oder Timer.restart(neuesdelay)), dann wirken sich jeder dieser beiden Befehle erst aus, wenn das Ende des actionPerformed erreicht ist (macht IMHO auch Sinn). Mein Chef möchte aber nun, dass das actionPerformed SOFORT unterbrochen wird, was sich mit den Bordmitteln von Java IMHO nicht machen läßt ....

Von daher wäre Deine Idee mit der boolschen Variable in der Tat nicht so schlecht ... ;-)

Gruß
Klaus
 
Zurück