使用给定的延迟调度特定时间间隔的java进程

时间:2015-06-09 10:38:03

标签: java scheduled-tasks scheduler schedule

我们希望安排一个java进程运行到特定的时间间隔。目前我正在考虑使用TimerTask来安排此过程。在每个循环的开始,将检查当前时间,然后与给定时间进行比较,并在时间结束时停止该过程。 我们的代码如下所示:

import java.util.Timer;
import java.util.TimerTask;

public class Scheduler extends TimerTask{

    public void run(){
        //compare with a given time, with getCurrentTime , and do a System.exit(0);
        System.out.println("Output");
    }

    public static void main(String[] args) {
        Scheduler scheduler = new Scheduler();
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(scheduler, 0, 1000);

    }

}

对此有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

不是检查每次迭代是否达到时间限制,而是可以为上述时间限制安排另一项任务,并在计时器上调用取消。

根据您可能考虑使用ScheduledExecutorService(例如ScheduledThreadPoolExecutor)的复杂性而定。 See in this answer when and why.

使用计时器的简单工作示例:

public class App {
    public static void main(String[] args) {
        final Timer timer = new Timer();
        Timer stopTaskTimer = new Timer();
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                System.out.println("Output");
            }
        };
        TimerTask stopTask = new TimerTask() {
            @Override
            public void run() {
                timer.cancel();
            }
        };

        //schedule your repetitive task
        timer.scheduleAtFixedRate(task, 0, 1000);
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date date = sdf.parse("2015-06-09 14:06:30");
            //schedule when to stop it
            stopTaskTimer.schedule(stopTask, date);
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}

答案 1 :(得分:2)

您可以使用RxJava,这是一个非常强大的反应式编程库。

Observable t =  Observable.timer(0, 1000, TimeUnit.MILLISECONDS);
t.subscribe(new Action1() {
                        @Override
                        public void call(Object o) {
                            System.out.println("Hi "+o);
                        }
                    }

) ;
try {
    Thread.sleep(10000);
}catch(Exception e){ }

您甚至可以使用lambda语法:

Observable t =  Observable.timer(0, 1000, TimeUnit.MILLISECONDS);
t.forEach(it -> System.out.println("Hi " + it));
try {
    Thread.sleep(10000);
}catch(Exception e){  }