博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Timer与TimerTask源码阅读杂记
阅读量:7096 次
发布时间:2019-06-28

本文共 1287 字,大约阅读时间需要 4 分钟。

hot3.png

TimerTask

实现Runnable接口。可以被Timer调度执行一次或者周期性执行的任务类。位于java.util包内。

实例属性:

int state; // 包括VIRGIN、SCHEDULED、EXECUTED、CANCELLED

long nextExecutionTime;   // 下一次任务执行时刻

long period;   // 周期性任务的执行时间间隔

方法:

TimerTask() 构造方法

abstract void run()

boolean cancel()  取消任务,更改任务状态state为CANCELLED。如果一次性任务还没有被执行或者是周期性任务,返回true。对于一次性任务,如果任务已经处于SCHEDULLED状态但还没有执行则永远不会被执行。而对于周期性任务,如果任务还没有被调度,则任务将不会被执行;而如果已经在执行,则执行完当前周期,但之后再也不会被执行。

这个方法可以被多次调用,但第二次以及之后的调用没有任何效果。

long scheduledExecutionTime():

返回本任务将要被执行的时刻,对于周期性任务没有什么意义。

Timer

线程安全的,多个线程可以共享一个Timer实例。

用来调度任务在将来执行一次或者周期性执行的辅助类。

每个Timer对象都对应一个后台线程(用于顺序执行timer上的任务)。

每个任务都应该能快速完成,否则如果某个TimerTask的执行占用太多

时间会影响后面的任务执行。

若想快速终止任务执行,可以调用它的cancel方法。

不提供实时保证,因为使用的Object.wait()方法。

实例属性:

TaskQueue queue = new TaskQueue();   // 任务队列,Binary Heap

TimerThread thread = new TimerThread(queue);

通过schedule方法将TimerTask加入TaskQueue

方法:

scheduleAtFixedRate:

sched(task, System.currentTimeMillis()+delay, period);

sechedule:

sched(task, System.currentTimeMillis()+delay, -period);

TimerThread extends Thread

执行具体任务的线程。

从任务队列取出executionTime最小的元素,然后判断如果是一次性任务则...

TaskQueue

任务队列类。是TimerTask的优先队列,根据nextExecutionTime排序。

基于Balanced Binary Heap实现,add、removeMin和rescheduleMin操作的时间复杂度为log(n)。getMin操作的时间复杂度为O(n)。小顶堆。

通过add(TimerTask task)加入任务

转载于:https://my.oschina.net/feichexia/blog/203258

你可能感兴趣的文章
文摘《十四》
查看>>
HTTP 错误 401.1 - 未授权:登录失败
查看>>
jquery的一些select操作小记
查看>>
jquery图片播放插件Fancybox(灯箱)
查看>>
最终大赛作品——VGA简单显示、简单视力检测
查看>>
初遇ACM之A+B问题
查看>>
Kali无法启动、无法安装
查看>>
ArrayList源码分析
查看>>
WiFi无线连接过程中有哪几个主要步骤?
查看>>
Webpack 开发工具与模块热替换
查看>>
Spring之ResourceLoader加载资源
查看>>
【HDOJ】1204 糖果大战
查看>>
推荐大家一个靠谱的论文检测平台
查看>>
String.xml的特殊用法(国际化、字体)和转换字符集
查看>>
打素数表(筛法)
查看>>
使用iscroll插件实现下拉刷新功能
查看>>
单源最短路:Bellman-Ford算法 及 证明
查看>>
线程2
查看>>
[Shiro] - shiro之SSM中的使用
查看>>
(Windows)Scala学习2--控制结构
查看>>