2016-08-03 4 views
2

Здесь вы найдете мое требование. У меня есть класс InvokeTimer, который вызывает TimerClass для каждой секунды/минуты/часа. В runnable TimerClass необходимо выполнить логику, когда таймер запускается на каждую секунду, т. Е. если его экземпляр stats1 и другая логика, если экземпляр stats2, если срабатывают каждую минуту, аналогичны в течение часа. Пожалуйста, помогите мне. Как я это делаю?Задача таймера запланировать несколько заданий

public class TimerClass extends TimerTask{ 
    @Override 
    public void run() { 
    if(stats1){ 
     //logic 
    }else if(stats2){ 
     //logic 
    }else{ 
    //logic3 
    } 
} 

public class InvokeTimer { 
     TimerClass stats1 = new TimerClass(); 
     TimerClass stats2 = new TimerClass(); 
     TimerClass stats3 = new TimerClass(); 
     Timer timer = new Timer(true); 

     timer.scheduleAtFixedRate(stats1, 0, 1 * 1000); 
     timer.scheduleAtFixedRate(stats2, 0, 60 * 1000); 
     timer.scheduleAtFixedRate(stats3, 0, 24* 60 * 1000); 
} 

ответ

1

Честно говоря, я думаю, что ваш лучший выбор здесь может быть, чтобы сделать ваши таймеры анонимных классов, которые каждый поддерживают метод Run(). Например, это было бы TimerClass что запищал каждый второй:

TimerClass stats1 = new TimerClass() { 
    @Override 
    public void run() { 
     java.awt.Toolkit.getDefaultToolkit().beep(); 
    } 
}; 

Timer timer = new Timer(true); 
timer.scheduleAtFixedRate(stats1, 0, 1 * 1000); 

Вы можете иметь один для каждой статистики, с уникальной логикой в ​​методе друг STATs'S.

Проверка того, какая версия статистики работает в рамках одного и того же метода, не является невероятно надежным способом настройки, но если вы мертвы на ней, я полагаю, вы могли бы сделать свои экземпляры экземпляров объекта TimerClass, затем в вашем случае-заявления говорят

if(this.equals(stats1)) 
    //logic 

, но я думаю, что вы должны были бы оба класса в одном файле .java для TimerTask, чтобы увидеть их. Если бы я был вами, я бы придерживался прежнего подхода.

Вы можете найти больше анонимных классов здесь: https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html

0

Вы можете поместить общие функции в базовом классе.

Расширяет все классы вашей конкретной статистики до базового класса.

Множественный оператор if else загромождает код.

Почему ScheduledThreadPoolExecutor лучше, чем объясняется таймер here.

Попробуйте использовать ScheduledThreadPoolExecutor, так как он лучше всего подходит для вашего использования.

Пример.

public class ScheduleSimulator { 

    public static void main(String[] args) { 

     final ScheduledExecutorService executor = Executors 
       .newScheduledThreadPool(3); 
     executor.scheduleAtFixedRate(new Stats1("X"), 0, 1, TimeUnit.SECONDS); 
     executor.scheduleAtFixedRate(new Stats2("Y"), 0, 1, TimeUnit.MINUTES); 
     executor.scheduleAtFixedRate(new Stats3("Z"), 0, 1, TimeUnit.HOURS); 

     Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { 

      @Override 
      public void run() { 
       executor.shutdownNow(); 

      } 
     })); 
    } 
} 

class CommonStats { 
    // Common functionality. 

} 

class Stats1 extends CommonStats implements Runnable { 
    private String name; 

    public Stats1(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 

    @Override 
    public void run() { 
     try { 
      System.out.println("Doing a task during : " + name + " - Time - " 
        + new Date()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

class Stats2 extends CommonStats implements Runnable { 
    private String name; 

    public Stats2(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 

    @Override 
    public void run() { 
     try { 
      System.out.println("Doing a task during : " + name + " - Time - " 
        + new Date()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

} 

class Stats3 extends CommonStats implements Runnable { 
    private String name; 

    public Stats3(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 

    @Override 
    public void run() { 
     try { 
      System.out.println("Doing a task during : " + name + " - Time - " 
        + new Date()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

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