计划多个作业的计时器任务

时间:2016-08-03 14:05:12

标签: java multithreading java-ee timer timertask

请在这里找到我的要求。我有一个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);
}

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您可以在基类中放置常用功能。

将所有特定的统计类扩展到基类。

多个if else语句使代码混乱。

为什么ScheduledThreadPoolExecutor比Timer更好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();
        }
    }

}