栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java如何简单实现一个定时器,高级java工程师面试题

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java如何简单实现一个定时器,高级java工程师面试题

它就像是一个闹钟一样,提醒你在一定时间之后该去做什么~~

前面在线程池的时候提到过两种可以执行延迟任务的方法

  • 创建一个单线程可以执行延迟任务的线程池,Executors.newSingleThreadScheduledExecutor();

  • 创建多个可以执行延迟任务的线程池,Executors.newScheduledThreadPool

用惯了Java提供的定时器,那么如何自己去简单实现一个定时器?

实现步骤(先描述再组织):

1.如何描述:首先提供一个Timer用来描述任务,其次Timer类里面要有一个时间(什么时候去执行任务)和任务

2.如何组织:提供一个worker类进行组织, 而woeker里面要提供执行方法和添加任务

3.进行调用

具体步骤

Timer类

//Timer类

class Timer {

//里面有两个属性,时间+任务

long time;

Runnable runnable;//任务就是Runnable类型的,因为它里面有自带run方法,更容易执行

//赋初值

public Timer(Runnable runnable, long after) {

this.runnable = runnable;

//这里的时间,我们就定义成多长时间之后去执行任务,也就是延迟时间 = 当前时间+要延迟的时间

this.time = System.currentTimeMillis() + after;

}

}

Worker类

//组织类(Worker)

class Worker {

//1.任务的扫描和执行

//如何扫描,也就是当初始化Worker的时候就创建一个线程一直去扫描任务

public Worker() {

}

//首先必须有任务,所以要写一个添加任务的方法,里面要传入任务和执行时间

public void schedule(Runnable runnable, long after) {

}

}

完整代码

import java.util.Date;

import java.util.concurrent.PriorityBlockingQueue;

//描述类(Timer)

class Timer implements Comparable {

//里面有两个属性,时间+任务

long time;

Runnable runnable;//任务就是Runnable类型的,因为它里面有自带run方法,更容易执行

//赋初值

public Timer(Runnable runnable, long after) {

this.runnable = runnable;

//这里的时间,我们就定义成多长时间之后去执行任务,也就是延迟时间 =

【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】

浏览器打开:qq.cn.hn/FTf 免费领取

当前时间+要延迟的时间

this.time = System.currentTimeMillis() + after;

}

//提供一个执行方法

public void run() {

runnable.run();

}

//优先级的排序方法

@Override

public int compareTo(Timer o) {

return (int) (this.time - o.time);//正序.正序的好处:把最紧急的任务排在最前面

//return (int)(o.time-this.time);//倒叙

}

}

//组织类(Worker)

class Worker {

//1.创建一个优先级队列,但是不是所有的任务都能够放进这个队列,所有我们就指定只能够存放我们Timer类里面的任务

//2.既然是一个优先级队列,那么肯定有它的优先级,也就是重写Comparable里面的compareTo()方法

PriorityBlockingQueue priorityBlockingQueue = new PriorityBlockingQueue<>();

//创建一个锁

Object lock = new Object();

//1.任务的扫描和执行

//如何扫描,也就是当初始化Worker的时候就创建一个线程一直去扫描任务

public Worker() {

Thread thread = new Thread(() -> {

while (true) {

//1.扫描任务,首先得要有一个容器去放任务,那就是得有优先级阻塞队列

try {

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/390244.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号