TimerTask 计划任务

在日常编程开发中,定时任务功能很常见,比如很多GUI框架都实现了“定时器”这种控件或是函数,用来实现类似安卓手机的连按两次退出功能,网络流量监视器的定时刷新功能等。JDK提供了TimerTask工具类,当然我们不借助它直接使用sleep()等机制也能实现,但显然代码和逻辑都比较复杂,写到最后结果就是自己封装了一个TimerTask。所以直接使用JDK提供的TimerTask实现定时计划任务是最方便的。

实现定时计划任务实际上需要两个类配合使用:TimerTimerTask

  • 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()的第二个参数是延迟时间。

这里说明几点问题:

  1. Timer的构造函数中,有一个boolean参数,代表这条线程是否是守护线程。Java中守护线程指从应用启动到应用进程终止都一直循环运行的线程。上面例子中显然只是想间隔一段时间执行某段代码,因此不是守护线程。
  2. 计划任务是在新线程中执行的,也就是说在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进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。