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



## vfl_freak (17. Februar 2011)

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


----------



## Maik639 (17. Februar 2011)

man könnte vllt eine if bedingung machen und dieser als bedingung den laufenden timer geben


----------



## Maik639 (17. Februar 2011)

also:

if (timerLäuft) {
   code
}

oder vllt auch mit while...

while (timerLäuft) {
 code
}


----------



## vfl_freak (17. Februar 2011)

Moin,

erstmal Danke für die Antwort 

Ich denke nicht, dass das mein Problem löst 

Hier vlt. noch der Code des Timers, der abgebrochen werden soll

```
/**
   * 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


----------



## Maik639 (17. Februar 2011)

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


```
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
//      }
    }
} );
```


----------



## Maik639 (17. Februar 2011)

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


----------



## vfl_freak (17. Februar 2011)

Moin Maik,



Maik639 hat gesagt.:


> ich habe noch nie etwas damit gemacht, aber wenn du einen boolean setzt und diesen als ifbedingung nimmst, dann sollte es doch gehen.
> 
> ```
> private boolean isTimerTaskAllowed;
> ...



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


----------



## Maik639 (17. Februar 2011)

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


----------



## vfl_freak (17. Februar 2011)

Hallo Maik,



Maik639 hat gesagt.:


> sry, war eben ein bissi in eile, kam sicher recht unhöflich rüber... sry dafür.


nö, wieso? War doch alles ok 



Maik639 hat gesagt.:


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



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


----------



## Maik639 (17. Februar 2011)

eig wollte ich die api ja gerade nicht lesen =P
aber der timer genau das was ich mir dedacht hatte ^^

mfg maik


----------



## vfl_freak (17. Februar 2011)

Maik639 hat gesagt.:


> eig wollte ich die api ja gerade nicht lesen =P



verstehe ...... ;-]


----------

