Timer verlängern

Maik639

Erfahrenes Mitglied
Hi Leute,

ich hab mal wieder ein Problem, ich dachte mir, bevor ich anfange mit System.currentTimeMillis() zu rechnen, frage ich hier mal.
Ist es möglich einen Timer zu verlängern?
Also so wäre das:

Code:
if (ereignis) {
// TimerTask wird eine Sekunde später ausgeführt
}

Grüße Maik
 
Wenn ich recht informiert bin sollte Timer von Thread erben und damit auch Thread.sleep(long) besitzen womit du ganz einfach den entsprechenden Thread für die angegebenen MillSec schlafen legst. Am einfachsten vllt mit Thread.getCurrentThread().sleep(long).
Ein einfaches Thread.sleep(long) funktioniert nicht da das dann wieder ein eigenständiger Thread wäre ... also wenn dann nur mit this.sleep(long).
 
Geht es dir darum, den Timer 1 mal aussetzen zu lassen oder ihn tatsächlich nur um einen bruchteil der Dauer zwischen 2 aufrufen zu verzögern?

1. Fall:
Wenn du den Timer einmalig aussetzen lassen möchtest, würde ich in einem anderen Thread ein Flag (boolean) setzen und es dann im Timer auslesen, z.B. so:
Java:
// Code außerhalb des Timers
Boolean suspendTimer = false;
//...
if (ereignis) {
  synchronized (suspendTimer){
    suspendTimer = true;
  }
}


// im TimerTask, zu Beginn der Methode run()
synchronized (suspendTimer){
   if(suspendTimer == true){
      suspendTimer = false;
      return;
   }
}

2. Fall: du möchtest die Ausführung des TimerTasks verzögern. Diese Lösung ist nur für kurze Intervalle geeignet, sonst müsstest du das warten (Thread.sleep()) außerhalb des synchronized-Blocks legen.
Java:
// Code außerhalb des Timers
Boolean delayTimer = false;
//...
if (ereignis) {
  synchronized (delayTimer){
    delayTimer = true;
  }
}


// im TimerTask, zu Beginn der Methode run()
synchronized (delayTimer){
   if(delayTimer == true){
      delayTimer = false;
      Thread.sleep(10);//10 ms schlafen legen; Achtung: try-catch nicht vergessen!!
   }
}
 
genodefests Lösung geht finde ich schon gut. Aber seine Lösung für die Verzögerung eignet sich nur für sehr kurze Verzögerungszeiten. Bei längeren Zeiten könnte der das schlafen lassen dafür sorgen, dass andere Tasks die in der Zeit dran wären nicht ausgeführt werden.
Wenn man also nicht wirklich sicher ist, dass der Timer für keine anderen Tasks zuständig ist, oder es einem egal ist ob diese ggf. verzögert werden sollte man denke ich eher in der von TimerTask erbenden Klasse dafür sorgen, dass das Objekt sich selber wieder einträgt. Also ca. so: (Ich wandle mal genodefests Code ein wenig ab)

Code:
// im TimerTask, zu Beginn der Methode run()
synchronized (delayTimer){
   if(delayTimer == true){
      delayTimer = false;
      timer.schedule(this, delay);
   }
}
 
Zurück