使用Timer类去调度任务 ——java
原文地址:https://dzone.com/articles/using-timer-class-to-schedule-tasks
原文作者:Jay Sridhar
很多时候我们写的JAVA程序需要运行一些任务。可能你想要定期清理一下资源,或者想要检查一下状态,又或者是要拿某个URL(第一次可能拿不到,需要多次尝试)。
针对上诉情况,Timer类提供了非常简单的接口用于任务调度。下面我们来看一下如何去使用。
定义你的任务
Timer类执行的任务需要继承TimerTask类。而TimerTask类是实现了Runnable接口的。这里有一个简单的继承TimerTask的例子。你只需要在run()方法里实现你的代码。
public class MyTask extends TimerTask { private String name; public MyTask(String name) { this.name = name; } public void run() { System.out.println(Thread.currentThread() + " executing " + this.name + " [" + new Date() + "]"); } }
运行任务
之后,你需要新建一个Timer实例,如下
Timer timer = new Timer();
非常简单。这个实例会开启一个线程在后台中运行,准备去执行任何你扔进去的任务。现在我们放一个任务进去。这里我们需要执行任务的时间安排,该任务会在指定的时刻执行并完成。
timer.schedule(new MyTask("john"), new Date(new Date().getTime() + 5000));
下面是结果输出:
Thread[Timer-0,5,main] executing john [Mon Apr 24 18:04:56 IST 2017]
使用Instant去创建日前
除了用上面那种笨拙的方式定义一个5秒后的时刻,你也可以用Instant类去实现。创建一个Instant类,增加5秒,之后再将它转化为Date类型。
timer.schedule(new MyTask("john"), Date.from(Instant.now().plusSeconds(5)));
重复执行任务
等等,Timer类当然不止这么点东西。Timer类也允许你重复执行某一个任务。在下面的代码中,我们每隔3秒就执行这个任务一次(比如去检查股票的行情)。
timer.schedule(new MyTask("jack"), 0, 3000);
下面的结果可以看出这个任务确实每隔3秒就执行一次
Thread[Timer-0,5,main] executing jack [Mon Apr 24 18:12:36 IST 2017]
Thread[Timer-0,5,main] executing jack [Mon Apr 24 18:12:39 IST 2017]
Thread[Timer-0,5,main] executing jack [Mon Apr 24 18:12:42 IST 2017]
几行代码就可以在你的应用中加入任务调度了,是不是很简洁?
延迟开始任务
如果你想重复执行任务,又想延迟一段之间开始,那怎么办呢?这种情况也是被考虑到的。下面我们定义了1秒后才开始任务,并且每隔0.5秒执行一次
timer.schedule(new MyTask("joe"), 1000, 500);
说明
Timer只是一个很简单的类,这意味着只适用于一些简单的情况。对于更加复杂的需求,比如线程池, 用ExecutorService更加合适。