2016-08-03 57 views
2

請在這裏找到我的要求。我有一個InvokeTimer類,它以每秒/分鐘/小時的速度調用TimerClass。在TimerClass的runnable中需要執行一個邏輯,當定時器每秒觸發一次如果它的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); 

你可以有一個對每個統計,每個統計的方法中是唯一的邏輯。

檢查哪個版本的統計信息在同一個方法中運行都不是一種非常可靠的設置方法,但是如果你死定了它,我想你可以讓你的TimerClass對象實例變量,然後在你的if語句說

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

,但我認爲你需要在同一個java文件既類的TimerTask看到他們。如果我是你,我會堅持前一種方法。

你可以找到更多關於此匿名類:https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html

0

你可以在基類中把常用功能。

將所有特定的統計類別擴展到基類。

多if if語句使代碼混亂。

爲什麼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(); 
     } 
    } 

}