TimerTask 计划任务
在日常编程开发中,定时任务功能很常见,比如很多GUI框架都实现了“定时器”这种控件或是函数,用来实现类似安卓手机的连按两次退出功能,网络流量监视器的定时刷新功能等。JDK提供了TimerTask工具类,当然我们不借助它直接使用sleep()等机制也能实现,但显然代码和逻辑都比较复杂,写到最后结果就是自己封装了一个TimerTask。所以直接使用JDK提供的TimerTask实现定时计划任务是最方便的。
实现定时计划任务实际上需要两个类配合使用:Timer和TimerTask:
Timer:定时器工具。TimerTask:被定时器执行的计划任务。
实现间隔一段时间后执行
下面的例子展示了如何间隔一段时间后,执行某段代码。
MyTask.java
package com.gacfox.demo;
import java.util.Timer;
import java.util.TimerTask;
class MyTask extends TimerTask {
private Timer timer;
MyTask(Timer timer) {
this.timer = timer;
}
@Override
public void run() {
System.out.println("Hello");
timer.cancel();
}
}
Main.java
package com.gacfox.demo;
import java.util.Timer;
public class Main {
public static void main(String[] args) {
Timer timer = new Timer(false);
timer.schedule(new MyTask(timer), 3000);
}
}
我们继承TimerTask实现了自己的计划任务类,计划任务的代码写在了run()方法中。timer.schedule()的第二个参数是延迟时间。
这里说明几点问题:
- Timer的构造函数中,有一个boolean参数,代表这条线程是否是守护线程。Java中守护线程指从应用启动到应用进程终止都一直循环运行的线程。上面例子中显然只是想间隔一段时间执行某段代码,因此不是守护线程。
- 计划任务是在新线程中执行的,也就是说在delay过程中,即等待计划任务代码执行时,主线程是不阻塞的。
实现循环执行
下面例子是每隔一定时间,循环执行某段计划任务代码,比如每小时备份一次数据库。
MyTask.java
package com.gacfox.demo;
import java.util.Timer;
import java.util.TimerTask;
class MyTask extends TimerTask {
private Timer timer;
MyTask(Timer timer) {
this.timer = timer;
}
@Override
public void run() {
System.out.println("Hello");
}
}
Main.java
package com.gacfox.demo;
import java.util.Timer;
public class Main {
public static void main(String[] args) throws InterruptedException {
Timer timer = new Timer(false);
timer.schedule(new MyTask(timer), 3000, 1000);
while (true) {
System.out.println("tick");
Thread.sleep(1000);
}
}
}
注意schedule()的参数,第二个参数是启动计划任务前的延迟时间,第二个参数是计划任务执行的间隔时间。
作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。