自己做的网站怎么发到网上,资源网站搭建,做网站 橙色怎么搭配,做网站必须要加v吗目录
一.定时器简介#xff1a;
二.定时器的构造方法与常见方法#xff1a;
三.定时器的模拟实现#xff1a;
思路分析#xff1a;
代码实现#xff1a; 在开发中#xff0c;我们经常需要一些周期性的操作#xff0c;例如每隔几分钟就进行某一项操作#xff0c;这…目录
一.定时器简介
二.定时器的构造方法与常见方法
三.定时器的模拟实现
思路分析
代码实现 在开发中我们经常需要一些周期性的操作例如每隔几分钟就进行某一项操作这时候我们就需要去设置个定时器Java中最方便最高效的实现方式是用java.util.Timer工具类在通过调度java.util.TimerTask任务来完成
一.定时器简介
①.Timer是一种工具线程用其安排以后在后台线程中执行的任务。可安排任务执行一次或者是定期的重复执行实际上是个线程定时调度所拥有的TimerTask任务
②.TimerTask是一个抽象类它的子类由Timer安排为一次执行或者重复执行的任务实际上就是一个拥有run方法的类需要定时执行的代码放到run方法体内.
二.定时器的构造方法与常见方法
①.构造方法 ②.常用方法 注意事项
①.上述方法中TimerTask是一个抽象方法其子类是一个可以被Timer执行的任务要执行的代码放在run()方法体内实现 ②.schedule()与scheduleAtFixedRate()的区别 首先schedule(TimerTask task,Date time)与schedule(TimerTask task,long delay)都只是单次执行操作并不存在多次调用任务的情况所以没有提供scheduleAtFixedRate方法的调用方式。它们实现的功能都一样那区别在哪里呢 1schedule()方法更注重保持间隔时间的稳定保障每隔period时间可调用一次。
2scheduleAtFixedRate()方法更注重保持执行频率的稳定保障多次调用的频率趋近于period 时间如果某一次调用时间大于period下一次就会尽量小于period以保障频率接近于period。
③.每一个Timer仅对应一个线程而不是每调用一次schedule就创建一个线程
④.Timer是线程安全的
代码实例1
import java.util.Timer;
import java.util.TimerTask;
public class Mian {public static void main(String[] args) throws InterruptedException {//创建定时器线程对象同时设置名字Timer timer new Timer(定时器线程);//传入要执行的任务同时设置等待的时间timer.schedule(new TimerTask() {Overridepublic void run() {String current Thread.currentThread().getName();System.out.println(current : 任务代码的执行区域~~~);}},2000);Thread.sleep(3000);System.out.println(执行结束);//结束定时器线程timer.cancel();}
}运行结果 代码实例2
import java.util.Timer;
import java.util.TimerTask;
public class Mian2 {public static void main(String[] args) throws InterruptedException {//创建定时器线程对象同时设置名字Timer timer new Timer(定时器线程);//传入要执行的任务同时设置等待的时间timer.schedule(new TimerTask() {Overridepublic void run() {String current Thread.currentThread().getName();System.out.println(current : 任务代码的执行区域~~~);}},1000,2000);Thread.sleep(6000);//结束定时器线程timer.cancel();}
}运行结果 三.定时器的模拟实现
在了解了什么是定时器和定时器的使用之后那么定时器是如何实现的呢这里我们通过模拟实现定时器来进一步加深对定时器的理解。注这里我们仅仅模拟实现Timer类不带参数的构造方法和等待delay时间后要执行的任务类以及核心方法schedule。
思路分析
Timer类通过schedule添加等待delay时间后执行的代码此时的任务可能不止一个我们需要一个容器来存放这些任务同时为了公平起见我们让先到达指定时间的任务优先执行很自然的我们可以想到用优先级队列来存储这些任务队首元素就是最先执行的任务.
同时我们也需要一个线程来扫描队首元素判断队首元素是否是需要执行的任务 综上我们自己模拟实现的定时器需要完成以下任务 ①.用一个优先级队列存放要执行的任务队首元素是最先执行的任务 ②.任务中带有时间属性记录任务所要执行的时间 ③.用一个线程来扫描队首元素判断队首元素是否需要执行 ④.这里出现多个线程同时操作共享数据的代码我们要解决线程安全问题 代码实现
import java.util.*;
class MyTimerTask implements ComparableMyTimerTask{//要执行的任务代码private Runnable runnable;//ms级别的时间戳private long time;public MyTimerTask(Runnable runnable,long delay){this.runnable runnable;//计算要执行的相对时间当前时间等待时间this.time System.currentTimeMillis() delay;}public void run(){runnable.run();}public long getTime(){return time;}//重写compareTo比较方法按照时间的从小到大排序Overridepublic int compareTo(MyTimerTask o) {return (int)(this.time - o.time);}}
//模拟实现定时器
class MyTimer{private PriorityQueueMyTimerTask q new PriorityQueue();//锁对象private static Object loker new Object();//构造方法中启动线程让线程进行判定与执行public MyTimer(){Thread t new Thread(()-{try{while(true){//将操作共享数据的队列锁起来一次只允许一个线程进行操作避免线程安全问题synchronized (loker){if(q.isEmpty()){loker.wait();}MyTimerTask current q.peek();//如果当前时间超过() 设定的时间此时需要执行任务if(System.currentTimeMillis() current.getTime()){current.run();//执行完成后将任务从队列中删除q.poll();}else{//否则不执行任务loker.wait(current.getTime() - System.currentTimeMillis());}}}}catch (InterruptedException e) {e.printStackTrace();}});//开启线程t.start();}public void schedule(Runnable runnable,long delay){//将操作共享数据的队列锁起来一次只允许一个线程进行操作避免线程安全问题synchronized (loker){MyTimerTask myTimerTask new MyTimerTask(runnable,delay);q.offer(myTimerTask);loker.notify();}}
}
//测试
public class Demo {public static void main(String[] args) {MyTimer myTimer new MyTimer();myTimer.schedule(()-{System.out.println(hello Thread ,3000 Thread.currentThread().getName());},3000);myTimer.schedule(()-{System.out.println(hello Thread ,2000 Thread.currentThread().getName());},2000);myTimer.schedule(()-{System.out.println(hello Thread ,1000 Thread.currentThread().getName());},1000);}
}运行结果 参考资料 Java定时器的使用Timer简介_51CTO博客_java定时器 资源--timer的使用 - 牛李 - 博客园 (cnblogs.com) 结语 写博客不仅仅是为了分享学习经历同时这也有利于我巩固知识点总结该知识点由于作者水平有限对文章有任何问题的还请指出接受大家的批评让我改进。同时也希望读者们不吝啬你们的点赞收藏关注你们的鼓励是我创作的最大动力