2016-08-03 22 views
2

Hier finden Sie meine Anforderung.Ich habe eine InvokeTimer-Klasse, die TimerClass für jede Sekunde/Minute/Stunde aufruft.Im Runable von TimerClass muss eine Logik ausgeführt werden, wenn der Timer für jede Sekunde ausgelöst wird wenn seine Instanz von stats1 und andere Logik wenn Instanz von stats2 wenn für jede Minute ausgelöst wird, ähnlich für eine Stunde. Bitte helfen Sie mir. Wie mache ich das?Timer-Task zum Planen mehrerer Jobs

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

Antwort

1

Ehrlich gesagt, ich glaube, Ihre beste Wette hier könnte es sein, Ihre Timer anonyme Klassen zu machen, die jeweils eine Methode run() unterstützen. Zum Beispiel würde dies eine TimerClass sein, die jede Sekunde piepste:

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

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

Sie einen für jede Statistik haben könnte, mit einzigartiger Logik innerhalb jeder Methode Statistik.

Überprüfen, welche Version von Stats alle innerhalb der gleichen Methode ausgeführt wird, ist nicht eine unglaublich zuverlässige Möglichkeit, Dinge einzurichten, aber wenn Sie fest darauf gesetzt sind, dann könnten Sie Ihre TimerClass-Objekte Instanz Variablen dann machen in der if-Anweisungen sagen

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

aber ich denke, Sie in der gleichen .java-Datei beiden Klassen bräuchten für Timertask sie zu sehen. Ich würde bei der früheren Vorgehensweise bleiben, wenn ich du wäre.

Sie können mehr über anonyme Klassen finden Sie hier: https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html

0

Sie gemeinsame Funktionalität in der Basisklasse setzen.

Erweitert alle Ihre spezifischen Statistikklassen auf die Basisklasse.

Mehrere if else-Anweisung verstopft den Code.

Warum ScheduledThreadPoolExecutor ist besser als Timer ist here erläutert.

Versuchen Sie, ScheduledThreadPoolExecutor zu verwenden, wie es für Ihren Anwendungsfall am besten ist.

Beispiel.

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

}