2016-06-01 5 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 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, которые очень похожи, как описано выше. Что мне следует делать при вызове action(); после вызова сна из команды run() в классе Event?

Любые идеи?

Ваша помощь приветствуется!

+0

Ваш код в порядке. Если вы выполняете метод run объекта ThermostatDay, он будет вызывать метод действия ThermostatDay. Аналогично для других объектов. Будет вызываться метод действия этого объекта, на котором выполняется метод запуска. –

+0

То, что не происходит, не печатает System.out.println (это); из метода действия дочернего класса –

+0

Он должен после истечения времени задержки. Можете ли вы показать код, как вы выполняете метод запуска дочернего класса? –

ответ

0

Создание и экземпляр переменной типа Event и конструктор, который принимает в событие в качестве параметра

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, вы можете передать его конструктору и после вызова метода действия в событии переменной экземпляра в класс будет запускать метод действия в этом дочернем классе – 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

Я не то, что выше всего, просто работал lol .. Нет подсказки –

 Смежные вопросы

  • Нет связанных вопросов^_^