Gear with Code Java Engineer

定时器任务,TimerTask和Timer类

2019-06-11

在java中使用Timer类和TimerTask类可以实现定时器效果的操作,比如每间隔1秒钟播放一声“滴”等,下面来看怎么用吧。

Timer类

首先来看Timer类,它提供了一系列的schedule方法,也就是计划方法,表示按各种不同的方式设定定时任务。

void schedule(TimerTask task, long delay)
void schedule(TimerTask task, long delay, long period)
void schedule(TimerTask task, Date time)
void schedule(TimerTask task, Date firstTime, long period)
void scheduleAtFixedRate(TimerTask task, long delay, long period)
void scheduleAtFixedRate(TimerTask task, Date firstTime, long period)

可以看到每个schedule方法都需要一个TimerTask参数,它表示要定时执行的任务。

TimerTask类

我们来看看TimerTask类,首先看到它的声明:

    public abstract class TimerTask
    extends Object
    implements Runnable

它是一个抽象类,并且需要实现Runnable接口。
再看它的方法:

protected  TimerTask()//保护类型的构造方法,只能在本类或派生类中调用

boolean cancel()//取消
abstract void run()//要实现的任务
long scheduledExecutionTime()//返回此任务最后一次执行的时间

也就是说TimerTask实现计划任务的方法实际上是通过多线程来实现的,将要执行的任务放在Runnable接口的run()方法中,然后启动一个线程来执行这个任务。

举栗子

下面来使用一下这两个类实现一个简单的任务,每间隔1s输出一下当前时间,正好复习一下Data类。

package javademo;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class JavaDemo {
    public static void main(String args[]) {
        Timer timer = new Timer();
        MyTask myTask=new MyTask();
        timer.scheduleAtFixedRate(myTask, 100, 1000);//100ms后开始执行,每隔1000ms执行一次
    }
}

//任务类
class MyTask extends TimerTask {
    public static final SimpleDateFormat SDF_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss-SSS");

    @Override
    public void run() {
        // TODO Auto-generated method stub
        // 输出当前时间
        Date date = new Date();
        System.out.println(SDF_DATE_FORMAT.format(date));
    }
}

输出结果:
2019-06-11 14-03-21-154
2019-06-11 14-03-22-155
2019-06-11 14-03-23-154
2019-06-11 14-03-24-154
2019-06-11 14-03-25-155
2019-06-11 14-03-26-154
2019-06-11 14-03-27-154
2019-06-11 14-03-28-155
2019-06-11 14-03-29-154
2019-06-11 14-03-30-155
2019-06-11 14-03-31-155
2019-06-11 14-03-32-154


Comments

Content