class Task extends TimerTask ohne Blockieren

noch_anfänger

Aktives Mitglied
Hallo,

ich suche eine bessere Lösung für mein Programm. In Main wird jede Sekunde abgefragt, ob sich die boolean Variablen auf dem Server geändert haben:
Java:
final Timer timer = new Timer();
	timer.schedule(new Task(), 2000, 1000);

Die Klasse Task:
Java:
public class Task extends TimerTask {
private String booleanInput0;
private String booleanInput1;

public void run() {
booleanInput0 = soapClient.readVariableBoolean("45255");
booleanInput1 = soapClient.readVariableBoolean("12345");

if (booleanInput0 == "true" && stateInput0.isEmpty()) {
// tue irgendwas
try {
	Thread.sleep(3000);
     } catch (InterruptedException e) {}
// tue irgendwas
if (stateInput0.get("state") == "1") {
try {
	Thread.sleep(6000);
} catch (InterruptedException e) {}
// tue irgendwas
else if (stateInput0.get("state") == "2") {
// tue irgendwas
}
try {
	Thread.sleep(3000);
     } catch (InterruptedException e) {}
}
if (booleanVariableInput0 == "false"
		    && stateInput0.get("state") == "1") {
try {
	Thread.sleep(6000);
    } catch (InterruptedException e) {}
// tue irgendwas
if (stateInput1.get("state") == "1") {
   try {
	  Thread.sleep(6000);
	} catch (InterruptedException e) {}
// tue irgendwas
}
}

if (booleanInput1 == "true" && stateInput1.isEmpty()) {
// mache dasselbe für booleanInput1
}
}
}

Das Problem ist, dass Task viele
Code:
Thread.sleep()
hat. Dadurch werden andere Abläufe blockieret. Obwohl Task jede Sekunde aufgerufen werden soll (mit
Code:
timer.schedule(new Task(), 2000, 1000)
), werden die booleanInput0 und booleanInput1 nicht jede Sekunde überprüft, und was in if-Scheilfen erledigt werden soll, wird nicht rechtzeitig erledigt. Ich vermute, das ist wegen zu viele Thread.sleep().

Kann mir jemand einen Ausweg empfehlen? Ich brauche wirklich eine Hilfe...:shock:
 
Nur wenn man die Aufgabenstellung falsch liest, ist das besser. 😳

Warum schmeißt Du nicht alle Sleeps aus dem Task raus und planst statt derer einfach einen je einen neuen Task im Timer? Verstehst Du wie ich das meine?

Ebenius
 
Du meinst in main mehrere
Code:
timer.schedule(new Task(), 2000, 1000);
für verschiedene Task machen?
Ist das möglich? Jeder Thread.sleep() wird nur dann ausgeführt, wenn eine Bedingung (if == ...) erfüllt ist. Alle Bedingungen dann in main auslagern und überprüfen?
 
Ich meinte eher sowas:
Java:
public class Task {

  private final Timer timer = new Timer();

  private class InitialTask extends TimerTask {
    @Override
    public void run() {
      final String booleanInput0 = soapClient.readVariableBoolean("45255");
      final String booleanInput1 = soapClient.readVariableBoolean("12345");
      if (booleanInput0 == "true" && stateInput0.isEmpty()) {
        // tue irgendwas
        timer.schedule(new DelayedTask(), 3000);
      }
    }
  }

  private class DelayedTask extends TimerTask {
    @Override
    public void run() {
      // tu wieder was
      timer.schedule(new EvenMoreDelayedTask(), 6000);
    }
  }

  ...
}
Jetzt verständlicher?

Ebenius
 
Sorry. Ne, die muss einfach nur [c]IrgendeineKlasse[/c] heißen und nicht [c]Task[/c]. Dein wiederholt auszuführender Task ist der [c]InitialTask[/c].

Ebenius
 
Ich muss jede Sekunde beim Server fragen, ob die Variablen sich verändert haben. Dafür hatte ich
Code:
timer.schedule(new Task, 2000, 1000)
. Wie kann ich das mit einer einfachen Klasse Task machen?
In main
Code:
Task task = new Task();
Wie wird dann InitialTask jede Sekunde ausgeführt?
 
Vergiss einfach meine äußere Klasse "Task". Nimm einfach an, Deine Klasse "Task" hieße nun InitialTask, DelayedTask ist ausgegliedert, und so musst Du weiter machen. Statt den ganzen sleeps einfach einen neuen HauMichTotTask in den Timer werfen und den Code danach abrufen. Der InitialTask läuft weiterhin sekündlich.

Ebenius
 
Sorry, dass ich so dumm bin...

Meine äußere Klasse soll auch extends TimerTask sein. Oder habe ich falsch verstanden? Sonst weiß ich nicht, wie ich jede Sekunde die Variablen überprüfen kann.
 
So?
Java:
public class IrgendeineKlasseDieKeinTimerTaskIst {

  private final Timer timer = new Timer();
 
  private class InitialTask extends TimerTask {
    @Override
    public void run() {
      final String booleanInput0 = soapClient.readVariableBoolean("45255");
      final String booleanInput1 = soapClient.readVariableBoolean("12345");
      if (booleanInput0 == "true" && stateInput0.isEmpty()) {
        // tue irgendwas
        timer.schedule(new DelayedTask(), 3000);
      }
    }
  }
 
  private class DelayedTask extends TimerTask {
    @Override
    public void run() {
      // tu wieder was
      timer.schedule(new EvenMoreDelayedTask(), 6000);
    }
  }

  ...

  void start() {
    timer.schedule(new InitialTask(), 3000, 3000);
  }
}
Ebenius
 

Neue Themen


Zurück
Oben