2016-06-01 16 views
0
public abstract class Event implements Runnable { 

    public void run() { 
    try { 
     Thread.sleep(delayTime); 
     action(); 
    } catch(Exception e) {e.printStackTrace();} 
    } 

} 

Ich habe diese Ereignisklasse oben, wenn ich versuche, den Thread starten sie den ersten Befehl des Thread läuft - Thread.sleep (Verzögerungszeit); Da die Event-Klasse abstrakt ist, möchte ich einige ihrer untergeordneten Klassenmethoden ausführen. Zum Beispiel, wenn ich action() aufrufe; es sollteJava Aufruf Kind Klassenmethode in Multithreading

public class ThermostatNight extends Event { 
    public ThermostatNight(long delayTime) { 
    super(delayTime); 
    } 
    public void action() { 
    System.out.println(this); 
    thermostat = "Night"; 
    } 
    public String toString() {return "Thermostat on night setting";} 
} 

Es gibt viele solche Kinderklassen, wie ThermostatDay, Fanon, FanOff, die sehr ähnlich sind, wie oben die Aktionsmethode aus der unteren Kind Klasse läuft. Was soll ich mit der Call-Aktion tun(); Nach dem Schlaf wird vom Befehl run() in der Event-Klasse aufgerufen?

Irgendwelche Ideen?

Ihre Hilfe wird geschätzt!

+0

Ihr Code ist in Ordnung. Wenn Sie die run-Methode des ThermostatDay-Objekts ausführen, wird die Aktionsmethode von ThermostatDay aufgerufen. Ähnlich für andere Objekte. Die Aktionsmethode dieses Objekts wird aufgerufen, auf der die run-Methode ausgeführt wird –

+0

Das passiert nicht, es druckt nicht die System.out.println (this); von der Kindklasse Aktionsmethode –

+0

Es sollte nach Ablauf der Verzögerungszeit. Können Sie den Code anzeigen, wie Sie die run-Methode der untergeordneten Klasse ausführen? –

Antwort

0

Erstellen und Instanz-Variable vom Typ Ereignis und einem Konstruktor, der

public class Event implements Serializable, Runnable { 
     private Event childClass; 

     public Event(long delayTime, Event childClass) { 
     this.delayTime = delayTime; 
     this.childClass = childClass; 

     } 

     public void run() { 
      try { 
      Thread.sleep(delayTime); 
      childClass.action(); 
      } catch(Exception e) {e.printStackTrace();} 
     } 
    } 
+1

eine Frage. Warum? – zubergu

+0

Sobald eine Klasse von Event erbt, muss diese Klasse der Aktionsmethode eine Implementierung geben, und da diese Klasse eine Kindklasse von Event ist, können Sie sie an den Konstruktor übergeben und die Aktionsmethode für das Instanzvariablenereignis in aufrufen die Klasse es wird die Aktionsmethode in diesem Kind-Klasse – tmj010

+0

Ich sehe nicht die Notwendigkeit, einen Dekorator anstelle von plain Vererbung –

0

ich hier das Problem erkannte in einem Ereignis als Parameter annimmt.

können Sie sehen action() in Versuch genannt wird {} unter:

public void run() { 
    try { 
     Thread.sleep(delayTime); 
     action(); 
    } catch(Exception e) {e.printStackTrace();} 
    } 

Wenn Sie es schieben wie unten aus, sollte der Code funktionieren.

public void run() { 
    try { 
     Thread.sleep(delayTime); 
    } catch(Exception e) {e.printStackTrace();} 
     action(); 
    } 
+0

Nein, das ist nicht der Grund, es sei denn, Sie unterbrechen den Thread, was nicht sein sollte passiert in den meisten Fällen. –

+0

Ich nicht das oben genannte Ding gerade gearbeitet lol .. Keine Ahnung –