Java多线程之定时器
文章目录
JDK的java.unit包中提供了定时器Timer,能够定时执行任务,用法如下所示:
package main.com.feng.usertimer;
import java.util.Timer;
import java.util.TimerTask;
public class Machine extends Thread {
private int a;
@Override
public synchronized void start() {
super.start();
// 把与timer关联的线程设为后台线程
Timer timer = new Timer(true);
TimerTask task = new TimerTask() {
@Override
public void run() {
reset();
}
};
// 设置定时任务,定时器将在10毫秒后执行task任务, 以后每隔50毫秒重复执行一次
timer.schedule(task, 10, 50);
}
public void reset(){
a = 0;
}
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println(getName() + ":" + a);
yield();
}
}
public static void main(String[] args) {
Machine machine = new Machine();
machine.start();
}
}
java.util.TimerTask类是一个抽象类,实现了Runable接口。在Machine类的start()方法中执行定义匿名类继承TimerTask类,它的run()方法表示定时器需要定时完成的任务。
java.util.Timer类的构造方法有几种重载形式,Timer(boolean isDaemon)允许把Timer关联的线程设为后台线程。Timer类本身不是线程类,但是在它的实现中利用线程来执行任务。
Timer类的schedule(TimerTask task, long delay, long period)方法用来设置定时器需要定时执行的任务。task 表示任务;delay 参数表示延迟执行的时间(毫秒),period表示每次执行任务的间隔时间(毫秒)。例如:
// 设置定时任务,定时器将在10毫秒后执行task任务, 以后每隔50毫秒重复执行一次
timer.schedule(task, 10, 50);
Timer类的schedule另一种重载形式:schedule(TimerTask task, long delay)。如果适用这个方法,表示仅仅执行一次任务,例如:
// 设置定时任务,定时器将在10毫秒后执行task任务
timer.schedule(task, 10);
以上代码表示定时器将在10毫秒以后开始执行task任务,以后不再重复执行。同一个定时器对象可以执行多个定时任务,例如:
timer.schedule(task1, 0, 1000);
timer.schedule(task2, 10, 50);
以上代码表示定时器会执行两个定时任务。第一个每间隔 1 秒执行一次,第二个任务没隔500毫秒执行一次