Timer是什么
是Java中的一个已经实现的方法,我们可以调用它为任务进行到点执行
举例
假如我有三个线程,要求在第一秒打印线程1,第二秒打印线程2,第三秒打印线程3
代码
import java.util.Timer;
import java.util.TimerTask;
public class demo8 {
//创建一个Timer实例对象,导包
public static Timer timer = new Timer();
public static void main(String[] args) {
Thread t1 = new Thread(()->{
//schedule翻译过来"计划表"
//调用Timer方法中的计划表
//为其new一个TimerTask(任务计划)
timer.schedule(new TimerTask() {
@Override
public void run() {
//这里面写任务执行的内容
System.out.println("1");
}
//这里写在程序开始后的第几ms开始执行上面的任务
}, 1000);
});
Thread t2 = new Thread(()->{
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("2");
}
},2000);
});
Thread t3 = new Thread(()->{
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("3");
}
},3000);
});
t1.start();
t2.start();
t3.start();
}
}
运行结果
再次解释一下Timer的使用
模拟实现Timer
import java.util.concurrent.PriorityBlockingQueue;
//要执行的任务的属性
class MyTask implements Comparable<MyTask> {
public Runnable runnable;
public long time;
public MyTask(Runnable runnable, long time) {
this.runnable = runnable;
this.time = System.currentTimeMillis()+time;//计算程序开始后多少秒开始执行任务(绝对时间)
}
@Override
public int compareTo(MyTask o) {
return (int) (this.time - o.time);
}
}
public class MyTimer{
private Object lock = new Object();
private PriorityBlockingQueue<MyTask> queue= new PriorityBlockingQueue<>();
public void schedule(Runnable runnable,long delay){
//将自己创建的任务和预计的时间放入优先阻塞队列里面
MyTask myTask = new MyTask(runnable,delay);
queue.put(myTask);
//防止忙等
synchronized(lock){
lock.notify();
}
}
MyTimer(){
Thread t = new Thread(()->{
while(true){
synchronized (lock){
try {
//取出预计最先执行的任务
MyTask myTask = queue.take();
//查看是否到达执行时间
long curTime = System.currentTimeMillis();
if(myTask.time <= curTime){
myTask.runnable.run();
}else{
//没有到达执行直接则从新放回,直到满足等待时间,wait被自动唤醒
queue.put(myTask);
lock.wait(myTask.time-curTime);
}
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
});
t.start();
}
}