一、定时任务管理器

我们把我们的任务A,B,C分别延时多久后执行。因为我这个定时任务管理器,肯定不会干扰我们主线程,自己开一个线程去执行。

这个线程的功能就是,先到时间的先执行。因此我们在进行放入任务的时候,就要把过期时间排好序。我这边采用的优先队列进行按照过期时间升序排列。到了时间就执行即可。

二、代码

TimerTask:每个定时任务类

@Data
@AllArgsConstructor
public class TimerTask {private int taskId;//时间类型可以化为long,比如8小时对应 8 * 60 * 60 * 1000private long expiration;}

TimerTaskManager:定时任务管理器

//开的一个线程去轮询
public class TimerTaskManager extends Thread{//是否关闭static boolean isOpen = true;//核心优先队列private final PriorityBlockingQueue<TimerTask> consumersByExpiration = new PriorityBlockingQueue<>(5,new Comparator<TimerTask>() {@Overridepublic int compare(TimerTask o1, TimerTask o2) {return (int) (o1.getExpiration() - o2.getExpiration());}});//将Task加入队列的方法,和过期时间public void addTask(TimerTask timerTask){consumersByExpiration.add(timerTask);}//关闭定时任务public void  shutDown(){isOpen = false;}public TimerTaskManager() {this.start();}@Overridepublic void run() {while(isOpen){if(consumersByExpiration.size() > 0 ){long curTime =new Date().getTime();//获得最早的那个到期那个任务,看时间是否到了if(consumersByExpiration.element().getExpiration() <= curTime){//已经过期,执行任务,去掉该任务//任务逻辑~~~System.out.println("执行" + consumersByExpiration.element().getTaskId() + "的当前时间" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(curTime)+ "过期的时间:" +  new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(consumersByExpiration.element().getExpiration()));//然后去掉consumersByExpiration.poll();}}}}
}

测试类:

public class MangerTest {public static void main(String[] args) throws InterruptedException {//只要这玩意一new就应该启动,所以这里在构造函数里面去启动startTimerTaskManager manager = new TimerTaskManager();for (int i = 1; i < 4; i++) {//过期时间大小long time = (4 - i) * 1000 * 3;long curTime = new Date().getTime();//任务的过期时间long expiration = time + curTime;System.out.println("创建任务" + i + "的当前时间" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(curTime)+ "过期的时间:" +  new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(expiration));TimerTask timerTask = new TimerTask(i, expiration);manager.addTask(timerTask);}//防止一下子主线程跑完。manager.join();}}

实现一个定时任务管理器相关推荐

  1. Golang入门教程(二)Ubuntu16.04下安装golang(实例:Golang 定时任务管理器)

    通过两种方式安装 一.通过apt-get安装 1.安装 sudo apt-get install golang 2.设置GOPATH变量 GOPATH是扩展库的目录,Go先搜索标准库目录,然后搜索GO ...

  2. php定时任务管理,基于PHP的定时任务管理器 Zebra-Crontab

    软件介绍 为什么使用PHP管理crontab 一般在定时任务较少的情况下,使用原生的crontab服务一般不会有什么问题,但当定时任务较多时就会产生如下问题: 文本形式的定时任务可读性很差,在没有任何 ...

  3. node.js 没有转发_如何用Nodejs编写一个定时消息提醒应用?

    背景: 同事告诉我最近一段时间每天上班长时间盯着屏幕工作经常眼睛疼,问我有没有好用定时提醒功能.我受到启发,决定用nodejs来实现一个定时提醒应用. 需求分析: 同事是个程序员,熟悉命令行操作,这样 ...

  4. 怎么做一个定时消息提醒_如何用Nodejs编写一个定时消息提醒应用?

    背景: 同事告诉我最近一段时间每天上班长时间盯着屏幕工作经常眼睛疼,问我有没有好用定时提醒功能.我受到启发,决定用nodejs来实现一个定时提醒应用. 需求分析: 同事是个程序员,熟悉命令行操作,这样 ...

  5. java 多线程——一个定时调度的例子

    java 多线程 目录: Java 多线程--基础知识 Java 多线程 -- synchronized关键字 java 多线程--一个定时调度的例子 java 多线程--quartz 定时调度的例子 ...

  6. 如何设置学生上计算机课玩游戏,如何在电脑上设置一个定时提醒学生上网课的待办任务...

    原标题:如何在电脑上设置一个定时提醒学生上网课的待办任务 说起拖延症的问题,很多人都有亲身经历,甚至因为拖延症的关系,造成了很多影响工作.学习.生活等方面诸多不好的后果,比如学生党可能会因为拖延症错过 ...

  7. javascript 实现一个定时遍历数组,每隔一段相同的时间取出数组中的一项进行操作

    javascript 实现一个定时遍历数组的方法,每隔一段相同的时间取出数组中的一项进行操作 如果使用频繁建议 可以利用原型链,方法挂在在Array的prototype上面 setTimeInLoop ...

  8. java cache定时过期_一个定时更新cache框架

    评论 # re: 一个定时更新cache框架 2006-12-13 15:34 BeanSoft 支持一下...呵呵..补充一下:quartz也可以用在非Web应用的定时操作,官方网站上说的.不要误解 ...

  9. 计算机设置定时密码登录,如何为自己的win7电脑设置一个定时更换密码的提醒?...

    很多人都喜欢为自己的电脑设置登录密码,因为这样可以增加电脑的安全,也可以让咱们电脑中的数据资料更加的安全,要知道,现在的电脑安全对于一个人来说是多么的重要,电脑中涉及到用户的个人隐私信息也是很多的.但 ...

  10. 如何创建一个定时管理的页面

    实现的效果: 类似这样的一个定时管理,对程序的中定时计划可以动态的控制其运行还是关闭 第一步:创建数据表: 如上图所示,创建如此数据表即可,而且关键的是最后的两个字段还没有用到 第二步,页面: 就是上 ...

最新文章

  1. android窗口退出动画,如何在Android中为弹出窗口制作动画
  2. 【iOS】sqlite3的使用(増删改查)
  3. 人工智能语音技术支持“多情感程度”调节,细腻演绎“人声”
  4. R语言case_when函数和cases函数实战
  5. jboss4.2.3_JBoss 4.2.x Spring 3 JPA Hibernate教程
  6. 【Bash】实现指定目录下的文件编码转换,以原文件名保存
  7. NodeJS使用淘宝 NPM 镜像/NPM使用国内源
  8. 2017-2018-1 20155338 加分项目——PWD的实现
  9. 2018年公有云iaas_2018年如何学会正确做云
  10. Pandas基础(一)——Pandas基础
  11. Gdiplus的使用
  12. 机器学习发展历史回顾
  13. 【算法工程师】华为技术面面试记录
  14. 【ROS小车9】仅用 RPLIDAR A1(思岚 A1) 雷达在 Ubuntu 虚拟机跑 gmapping
  15. 逻辑结构定义及其分类
  16. html中写页边距,html整体页面边距怎么设置
  17. 基于采样的路径规划算法RRT和代码实现
  18. Springboot2中文件上传报java.io.FileNotFoundException: C:\Users\WIzarder\AppData\Local\Temp\tomcat.8080.589
  19. 三洋服务器显示F6,三洋空调故障代码有哪些?
  20. 感量越大抑制频率约低_电子产品:开关电源系统EMI传导快速设计理论(讲义部分)...

热门文章

  1. ospf 指定dr_OSPF中DR、BDR竞选机制
  2. vue生成静态html文件_是否可以将Vue.js模板编译为静态HTML和CSS文件?
  3. python发送邮件的模块_python Email 邮件发送模块
  4. ppt地图分布图一块一块的怎么做_没想到PPT还能这样做动态地图,实在是太炫酷了,用了再也离不开...
  5. 计算机配件详情图解,电脑装机教程,详细教您怎么组装电脑
  6. 文件读写: 二进制方式和文本方式的区别
  7. 整数划分之四 【区间dp】讲解于思考方法
  8. nyoj107hdu A Famous ICPC Team
  9. 【CF-gym101889:J】Jumping frog(圆上跳----思维)
  10. linux密钥链接失败的原因,linux中ssh密钥登录失败问题解决办法