TimerTask 类

public abstract class TimerTask implements Runnable {/*** 控制访问timertask内部的锁*/final Object lock = new Object();/*** 初始状态为0,就是还没有被计划执行*/int state = VIRGIN;/*** 最初始化的状态*/static final int VIRGIN = 0;/*** 已经被计划执行了*/static final int SCHEDULED   = 1;/*** 正在被执行,反正没有被返回*/static final int EXECUTED    = 2;/*** 已经被返回了,*/static final int CANCELLED   = 3;/*** 下次将要被执行的时间*/long nextExecutionTime;/*** 间隔多久执行任务*/long period = 0;/*** 构造函数*/protected TimerTask() {}/*** 会被子类实现,run的内容就是任务的内容*/public abstract void run();/*** 执行返回,如果正在被执行,那么会等执行完毕,再返回*/public boolean cancel() {synchronized(lock) {boolean result = (state == SCHEDULED);state = CANCELLED;return result;}}/*** 返回下一次要被执行的时间*/public long scheduledExecutionTime() {synchronized(lock) {return (period < 0 ? nextExecutionTime + period: nextExecutionTime - period);}}
}

TaskQueue类源码

class TaskQueue {/*** 优先级任务对列,队列初始化的长度为128,这个队列是一个最小堆* 最小堆就是父节点总是小于等于子节点,这里的大小是任务执行的时刻,任务执行的时刻* 最小的,放在根节点,就是按照先后顺序*/private TimerTask[] queue = new TimerTask[128];/*** 优先级对列中的任务数*/private int size = 0;/*** 返回size的值*/int size() {return size;}/*** 向对列添加一个任务*/void add(TimerTask task) {// 如果队列中任务数要满的时候,就扩展队列的长度为2倍if (size + 1 == queue.length)queue = Arrays.copyOf(queue, 2*queue.length);queue[++size] = task; //将任务添加到队列中fixUp(size); //在队列末尾插入一个任务后,要重新调整最小堆,以保证最小堆的大小顺序}/*** 返回最小堆中的根节点,最小的执行时间的任务*/TimerTask getMin() {return queue[1];}/*** 根据下标i,返回任务*/TimerTask get(int i) {return queue[i];}/*** 删除最小的任务(根节点),然后将队列末尾的那个值放在根节点处,再调整堆的顺序*/void removeMin() {queue[1] = queue[size];queue[size--] = null; fixDown(1);}/*** 直接删除第i个节点,然后将队列末尾的那个节点占据i节点位置,不调整堆的顺序*/void quickRemove(int i) {assert i <= size;queue[i] = queue[size];queue[size--] = null;  }/*** 设置根节点的执行时间,然后重新调整堆的顺序*/void rescheduleMin(long newTime) {queue[1].nextExecutionTime = newTime;fixDown(1);}/*** 判断任务数是否为0*/boolean isEmpty() {return size==0;}/*** 将这个队列清空*/void clear() {for (int i=1; i<=size; i++)queue[i] = null;size = 0;}/*** 将K节点从底向上调整堆的顺序*/private void fixUp(int k) {while (k > 1) {int j = k >> 1;if (queue[j].nextExecutionTime <= queue[k].nextExecutionTime)break;TimerTask tmp = queue[j];  queue[j] = queue[k]; queue[k] = tmp;k = j;}}/*** 从k节点从上向下调整堆顺序*/private void fixDown(int k) {int j;while ((j = k << 1) <= size && j > 0) {if (j < size &&queue[j].nextExecutionTime > queue[j+1].nextExecutionTime)j++; // j indexes smallest kidif (queue[k].nextExecutionTime <= queue[j].nextExecutionTime)break;TimerTask tmp = queue[j];  queue[j] = queue[k]; queue[k] = tmp;k = j;}}/*** 调整一个堆的顺序*/void heapify() {for (int i = size/2; i >= 1; i--)fixDown(i);}
}

最大堆 ,父节点的值总是大于等于子节点的值。

一个节点的下标,比如 7>>1 就跑到了父节点,6也是。

一个节点的下标,比如 1<<1,就跑到了左子节点2,然后2+1,就跑到了右子节点3。

TimerThread类源码

class TimerThread extends Thread {/*** true代表队列中已经没有任务了,false代表Timer对象的引用已经无效了*/boolean newTasksMayBeScheduled = true;/*** 任务队列,最小堆*/private TaskQueue queue;TimerThread(TaskQueue queue) { //构造方法this.queue = queue;}public void run() {try {mainLoop();} finally {// Someone killed this Thread, behave as if Timer cancelledsynchronized(queue) {newTasksMayBeScheduled = false;queue.clear();  // Eliminate obsolete references}}}/*** The main timer loop.  (See class comment.)*/private void mainLoop() {while (true) {try {TimerTask task;boolean taskFired;synchronized(queue) {// Wait for queue to become non-emptywhile (queue.isEmpty() && newTasksMayBeScheduled)queue.wait();if (queue.isEmpty())break; // Queue is empty and will forever remain; die// Queue nonempty; look at first evt and do the right thinglong currentTime, executionTime;task = queue.getMin();synchronized(task.lock) {if (task.state == TimerTask.CANCELLED) {queue.removeMin();continue;  // No action required, poll queue again}currentTime = System.currentTimeMillis();executionTime = task.nextExecutionTime;if (taskFired = (executionTime<=currentTime)) {if (task.period == 0) { // Non-repeating, removequeue.removeMin();task.state = TimerTask.EXECUTED;} else { // Repeating task, reschedulequeue.rescheduleMin(task.period<0 ? currentTime   - task.period: executionTime + task.period);}}}if (!taskFired) // Task hasn't yet fired; waitqueue.wait(executionTime - currentTime);}if (taskFired)  // Task fired; run it, holding no lockstask.run();} catch(InterruptedException e) {}}}
}

Timer 和 TimerTask 定时任务相关推荐

  1. Java Timer、TimerTask(定时任务)

    >java.util.Timer 一种工具,线程用其安排以后在后台线程中执行的任务.可安排任务执行一次,或者定期重复执行. TimerTask实现了Runnable接口,作为定时执行的任务载体. ...

  2. Java 中Timer和TimerTask 定时器和定时任务使用的例子

    转载自  Java 中Timer和TimerTask 定时器和定时任务使用的例子 这两个类使用起来非常方便,可以完成我们对定时器的绝大多数需求 Timer类是用来执行任务的类,它接受一个TimerTa ...

  3. Java定时任务(一) Timer及TimerTask的案例解析及源码分析

    Java定时任务(一)  Timer及TimerTask的案例解析及源码分析 一.概述: 定时任务这个概念在Java的学习以及项目的开发中并不陌生,应用场景也是多种多样.比如我们会注意到12306网站 ...

  4. java timertask 定时_Java定时任务--Timer和TimerTask

    1.程序和编程 我们知道,计算机程序是一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具. 简单来说程序在本质上是指令的集合,而编程从字面上来讲就是编写这些指令集合(程序) ...

  5. java step1:基础知识5(java中Timer和TimerTask的使用)

    1.定时任务:java中Timer和TimerTask的使用 转载自http://batitan.iteye.com/blog/253483 转载于:https://www.cnblogs.com/s ...

  6. 定时器Timer与TimerTask的使用

    一:简介 在JDK类库中Timer主要负责计划任务的功能,也就是在指定时间执行某一任务,执行时候会在主线程之外起一个单独的线程执行指定的任务.该类主要是设置任务计划,但封装的类是TimerTask类. ...

  7. timertask java_java Timer和TimerTask(简单的使用)

    Timer 是一个定时工具 TimerTask 是一个实现了Runnable接口抽象类,代表可以被Timer执行的任务 (1)Timer.schedule(TimerTask task,Date ti ...

  8. java中timer和timertask_java中Timer和TimerTask的使用

    Timer是jdk提供的一个定时工具,单独另起一条线程,执行一次任务或执行多次任务.TimerTask是一个抽象类,实现了Runable接口,代表了一个可以被Timer执行的任务. 用法:Timer ...

  9. Java多线程总结(3)— Timer 和 TimerTask深入分析

    1. 基本概念   java.util.Timer:是一个实用工具类,该类用来调度一个线程(schedule a thread),使它可以在将来某一时刻执行. Java的Timer类可以调度一个任务运 ...

最新文章

  1. 一文教会你什么线程安全以及如何实现线程安全
  2. .net core出现Http Error 502.5 - Process Failure
  3. Java 高级 --- 多线程快速入门
  4. Java————迷宫问题
  5. java pojo使用_在POJO中使用ThreadLocal进行Java嵌套事务
  6. 使用JMeter对异步HTTP / REST服务进行压力/负载测试
  7. 解题报告 Lights
  8. 数据结构-单链表的正向排序
  9. 【语言处理与Python】1.3计算语言:简单的统计
  10. 如何进行系统分析与设计
  11. SAP SD客户主数据
  12. upset图形如何理解
  13. 大话——从细分市场观商业模式
  14. 红米手机1 升级到android5,从小米MAX 1到红米 K20 pro的“升级”之路。
  15. 一、jSP简介(前置知识)
  16. PbootCMS采集-PbootCMS采集插件-免费PbootCMS采集方法点解
  17. 巧用热图展示基因分布的总体趋势
  18. SNR、BER、Eb/N0之间的区别与联系
  19. html中如果设置颜色为半透明状态,css如何利用transparent属性设置透明度?
  20. wxpython可视化_wxPython GUI生成器工具

热门文章

  1. 图像金字塔、高斯金字塔、拉普拉斯金字塔是怎么回事?附利用拉普拉斯金字塔和高斯金字塔重构原图的Python-OpenCV代码
  2. IT行业的就业真的有那么火吗?
  3. 奇虎360或拆分业务上市 面临监管难题
  4. 基于Android Studio的蓝牙通信的简单应用与开发
  5. 丨做文员的工作丨笔记本文件丢了如何恢复呢
  6. K8S,k3s 分布式存储:rook-ceph or Longhorn
  7. 在Linux系统搭建Hugo博客
  8. HTTPS URL是否被加密?
  9. 什么是html5营销方式,如何快狠准的创造出爆款HTML5营销案例
  10. 【LOJ6569】仙人掌计数