文档章节

Java Timer 源码分析

666B
 666B
发布于 11/19 17:59
字数 724
阅读 6
收藏 0

1 Java Timer实现功能、原理分析

1.1 功能

  • 延时、单次执行任务(java.util.Timer#schedule(java.util.TimerTask, long),单次执行,周期传0)
  • 指定时间、单次执行任务(java.util.Timer#schedule(java.util.TimerTask, java.util.Date))
  • 延时、周期性执行任务(java.util.Timer#schedule(java.util.TimerTask, long, long))
  • 指定时间、周期性执行任务(java.util.Timer#schedule(java.util.TimerTask, java.util.Date, long))
  • 延时、固定频率周期性执行任务(java.util.Timer#scheduleAtFixedRate(java.util.TimerTask, long, long),周期的取值为正数)
  • 指定时间、周期性执行任务(java.util.Timer#scheduleAtFixedRate(java.util.TimerTask, java.util.Date, long),周期的取值为正数)
  • 通用执行任务方法(根据传入周期来确定定时器任务的执行时间;如果传入的周期是负数的话,是相对于系统当前时间的,非负数的话是相对于任务的执行时间的即固定频率是相对于执行时间的)

1.1.1 周期性执行任务和固定频率周期性执行任务的区别

周期性执行任务是要考虑任务的执行时间的;
固定频率周期性执行任务是不考虑任务执行时间的;
可以参考java.util.TaskQueue#rescheduleMin()方法调用的地方,如下:

queue.rescheduleMin(
	task.period<0 ? currentTime   - task.period
		: executionTime + task.period);

1.2 涉及到的类

1.2.1 主要类

  • java.util.Timer
    初始化定时任务存放队列;
    初始化定时调度线程并启动;
    安排(计划)定时任务(安排完后需要唤醒定时调度线程,运用了生产者-消费者模式);
    维护任务的状态。
  • java.util.TimerTask
    同步锁;
    任务状态:未使用的、已调度、已执行、已取消;
    任务执行间隔时间;
    定义具体的执行的任务;
    取消该任务。

1.2.2 辅助类

  • java.util.TimerThread
    定时调度线程,通过死循环及生产者消费者模式实现,当任务队列为空时跳出死循环,用于消费定时器生产出的定时任务,并维护定时任务执行、修改下次执行时间、移除。
  • java.util.TaskQueue
    任务队列,底层是数组实现的,当数组数量达到数组长度数-1时继续添加任务会使用数组复制功能来复制到一个长度是现在2倍的数组中;
    提供获取执行时间最小的任务和执行时间第n小的功能;
    提供移除执行时间最小的任务和执行时间第n小的功能;
    数组中个任务往前移动的功能;
    设置执行时间最小任务下次执行时间;
    清空队列任务。

1.3 涉及到的概念

1.3.1 数据结构

  • 动态数据
  • 队列

1.3.2 操作系统概念

  • 生产者-消费者问题

1.3.3 Java 并发机制

  • 锁机制

© 著作权归作者所有

共有 人打赏支持
666B
粉丝 31
博文 92
码字总数 33430
作品 0
深圳
程序员
私信 提问
java并不认识python系列——谈谈搞混淆的@大法

怪自己二,曾一度理解java的@和python的@是类似的概念,在刷了python后,回头来再看java的注解各种懵逼,立下此文,以警后人,顺便,题段诗: python代码跑完后,冬雷滚滚夏雨雪。 java项目看...

守恒的猫
2017/11/03
0
0
PerfMa给OpenJDK社区提交的第一个Patch

概述 前两天给openjdk gc-dev的email list提交了一个问题,主要是针对Full GC之后,GC日志里Metaspace的大小在GC前后都一直不变的问题,我在邮件里大概也提了下如何修复该问题,以及猜测了下...

你假笨
09/25
0
0
升级到JDK9的一个BUG,你了解吗

概述 前几天在一个群里看到一个朋友发了一个demo,说是JDK的bug,昨天在JVM的一个群里又有朋友发了,觉得挺有意思,分享给大家,希望大家升级JDK的版本的时候注意下是否存在这样的代码,如果...

你假笨
06/06
0
0
sharding-jdbc源码分析—准备工作

原文作者:阿飞Javaer 原文链接:https://www.jianshu.com/p/7831817c1da8 接下来对sharding-jdbc源码的分析基于tag为源码,根据sharding-jdbc Features深入学习sharding-jdbc的几个主要特性...

飞哥-Javaer
05/03
0
0
嵌入式 内存 数据库H2 Mixed Mode布署

Connection Modes The following connection modes are supported: Embedded mode (local connections using JDBC) Remote mode (remote connections using JDBC or ODBC over TCP/IP) Mixed......

JavaGG
2010/03/24
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

java框架学习日志-7(静态代理和JDK代理)

静态代理 我们平时去餐厅吃饭,不是直接告诉厨师做什么菜的,而是先告诉服务员点什么菜,然后由服务员传到给厨师,相当于服务员是厨师的代理,我们通过代理让厨师炒菜,这就是代理模式。代理...

白话
今天
22
0
Flink Window

1.Flink窗口 Window Assigner分配器。 窗口可以是时间驱动的(Time Window,例如:每30秒钟),也可以是数据驱动的(Count Window,例如:每一百个元素)。 一种经典的窗口分类可以分成: 翻...

满小茂
今天
17
0
my.ini

1

architect刘源源
今天
15
0
docker dns

There is a opensource application that solves this issue, it's called DNS Proxy Server It's a DNS server that solves containers hostnames, if could not found a hostname that mat......

kut
今天
15
0
寻找数学的广度——《这才是数学》读书笔记2700字

寻找数学的广度——《这才是数学》读书笔记2700字: 文|程哲。数学学习方式之广:国内外数学教育方面的专家,进行了很多种不同的数学学习方式尝试,如数学绘本、数学游戏、数学实验、数学步道...

原创小博客
今天
27
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部