您的位置:首页 > 科技 > 能源 > 网络编程基础知识_织梦cms收费不交有事吗_优秀的软文_网络推广seo教程

网络编程基础知识_织梦cms收费不交有事吗_优秀的软文_网络推广seo教程

2024/11/16 1:11:07 来源:https://blog.csdn.net/nmbg11/article/details/143279594  浏览:    关键词:网络编程基础知识_织梦cms收费不交有事吗_优秀的软文_网络推广seo教程
网络编程基础知识_织梦cms收费不交有事吗_优秀的软文_网络推广seo教程

目录

一. 什么是定时器?

二. java中的定时器类

三. 定时器的简单使用.

四. 模拟实现定时器

4.1 实现 MyTimerTask

4.2 实现 MyTimer


一. 什么是定时器?

定时器相当于闹钟, 时间到了就执行一些逻辑.


二. java中的定时器类

使用Timer类实例化一个定时器对象.

Timer类中的核心方法: schedule(TimerTask, long);

TimerTask是一个抽象方法, 实现了Runnable接口, 重写了run抽象方法.


三. 定时器的简单使用.

    public static void main(String[] args) throws InterruptedException{Timer timer = new Timer();// lambda: 函数式接口, 接口中有且仅有一个抽象方法timer.schedule(new TimerTask() { // 匿名内部类@Overridepublic void run() {System.out.println(1000);}}, 1000);timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println(2000);}}, 2000);timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println(3000);}}, 3000);System.out.println("main");Thread.sleep(3000);timer.cancel(); // 终止timer中的前台线程}

cancel()方法用来终止timer类中的前台线程.


四. 模拟实现定时器

4.1 实现 MyTimerTask

class MyTimerTask implements Comparable<MyTimerTask> {private Runnable task;// 记录任务要执行的时刻private long time;public MyTimerTask(Runnable task, long time) {this.task = task;this.time = time;}@Overridepublic int compareTo(MyTimerTask o) {return (int) (this.time - o.time);// return (int) (o.time - this.time);}public long getTime() {return time;}public void run() {task.run();}
}

4.2 实现 MyTimer

class MyTimer {private PriorityQueue<MyTimerTask> queue = new PriorityQueue<>();// 直接使用 this 作为锁对象, 当然也是 ok 的private Object locker = new Object();public void schedule(Runnable task, long delay) {synchronized (locker) {// 以入队列这个时刻作为时间基准.MyTimerTask timerTask = new MyTimerTask(task, System.currentTimeMillis() + delay);queue.offer(timerTask);locker.notify();}}public MyTimer() {// 创建一个线程, 负责执行队列中的任务Thread t = new Thread(() -> {try {while (true) {synchronized (locker) {// 取出队首元素// 还是加上 whilewhile (queue.isEmpty()) {// 这里的 sleep 时间不好设定!!locker.wait();}MyTimerTask task = queue.peek();if (System.currentTimeMillis() < task.getTime()) {// 当前任务时间, 如果比系统时间大, 说明任务执行的时机未到locker.wait(task.getTime() - System.currentTimeMillis());} else {// 时间到了, 执行任务task.run();queue.poll();}}}} catch (InterruptedException e) {e.printStackTrace();}});t.start();}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com