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

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

} 

我上面有這個事件類,當我嘗試啓動線程時它運行線程的第一個命令 - Thread.sleep(delayTime);由於Event類是抽象的,我想運行它的一些子類方法。例如,當我調用action();應該從下面的子類運行的操作方法多線程中的Java調用子類方法

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";} 
} 

有很多這樣的子類,像ThermostatDay,法農,FanOff誰如上非常相似。我應該怎麼做call call();在Event類的run()命令中調用睡眠之後?

任何想法?

您的幫助表示感謝!

+0

你的代碼沒問題。如果您執行ThermostatDay對象的運行方法,它將調用ThermostatDay的操作方法。對其他對象也是如此。該對象的操作方法將被調用,正在執行run方法 –

+0

那沒有發生,它不打印System.out.println(this);從孩子集體行動方法 –

+0

延遲時間過後應該。你可以顯示代碼如何執行子類的運行方法嗎? –

回答

0

創建和類型的事件,並且在 事件發生的參數

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

一個問題。爲什麼? – zubergu

+0

一旦類從Event繼承,那個類必須給Action方法一個實現,並且由於該類是Event的子類,所以可以將它傳遞給構造函數,並且一旦您調用實例變量事件的action方法它將在該子類中運行操作方法的類 – tmj010

+0

我不認爲需要使用裝飾器而不是普通繼承 –

0

我在這裏認識這一問題的構造的實例變量。

你可以看到動作()被調用嘗試{}如下:

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

如果你把它像下面的代碼應該工作正常。

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

不,這不是原因,除非您中斷線程,而不應該在大多數情況下發生。 –

+0

我不是說上面的東西只是工作大聲笑..沒有線索 –