1、Timer 组成:TaskQueue  TimerThread

TaskQueue  是用来存储 TimerTask  ,TimerTask 是Runnable 子类

class TaskQueue
{
  private TimerTask[] queue = new TimerTask[128];
  private int size = 0;

int size()
  {
    return this.size;
  }

void add(TimerTask paramTimerTask)
  {
    if (this.size + 1 == this.queue.length)
      this.queue = ((TimerTask[])Arrays.copyOf(this.queue, 2 * this.queue.length));
    this.queue[(++this.size)] = paramTimerTask;
    fixUp(this.size);
  }

TimerTask getMin()
  {
    return this.queue[1];
  }

TimerTask get(int paramInt)
  {
    return this.queue[paramInt];
  }

void removeMin()
  {
    this.queue[1] = this.queue[this.size];
    this.queue[(this.size--)] = null;
    fixDown(1);
  }

void quickRemove(int paramInt)
  {
    assert (paramInt <= this.size);
    this.queue[paramInt] = this.queue[this.size];
    this.queue[(this.size--)] = null;
  }

void rescheduleMin(long paramLong)
  {
    this.queue[1].nextExecutionTime = paramLong;
    fixDown(1);
  }

boolean isEmpty()
  {
    return (this.size == 0);
  }

void clear()
  {
    for (int i = 1; i <= this.size; ++i)
      this.queue[i] = null;
    this.size = 0;
  }

private void fixUp(int paramInt)
  {
    while (paramInt > 1)
    {
      int i = paramInt >> 1;
      if (this.queue[i].nextExecutionTime <= this.queue[paramInt].nextExecutionTime)
        return;
      TimerTask localTimerTask = this.queue[i];
      this.queue[i] = this.queue[paramInt];
      this.queue[paramInt] = localTimerTask;
      paramInt = i;
    }
  }

private void fixDown(int paramInt)
  {
    while (((i = paramInt << 1) <= this.size) && (i > 0))
    {
      int i;
      if (((i < this.size) && (this.queue[i].nextExecutionTime > this.queue[(i + 1)].nextExecutionTime)) || (this.queue[paramInt].nextExecutionTime <= this.queue[(++i)].nextExecutionTime))
        return;
      TimerTask localTimerTask = this.queue[i];
      this.queue[i] = this.queue[paramInt];
      this.queue[paramInt] = localTimerTask;
      paramInt = i;
    }
  }

void heapify()
  {
    for (int i = this.size / 2; i >= 1; --i)
      fixDown(i);
  }
}

TimerThread 只是一个线程,用来执TaskQueue里面的TimerTask  里面的run方法而不是start方法.

package java.util;

class TimerThread extends Thread
{
  boolean newTasksMayBeScheduled = true;
  private TaskQueue queue;

TimerThread(TaskQueue paramTaskQueue)
  {
    this.queue = paramTaskQueue;
  }

public void run()
  {
    try
    {
      mainLoop();
    }
    finally
    {
      synchronized (this.queue)
      {
        this.newTasksMayBeScheduled = false;
        this.queue.clear();
      }
    }
  }

private void mainLoop()
  {
    while (true)
      try
      {
        TimerTask localTimerTask;
        int i;
        synchronized (this.queue)
        {
          while ((this.queue.isEmpty()) && (this.newTasksMayBeScheduled))
            this.queue.wait();
          if (this.queue.isEmpty())
            return;
          localTimerTask = this.queue.getMin();
          long l1;
          long l2;
          synchronized (localTimerTask.lock)
          {
            if (localTimerTask.state == 3)
            {
              this.queue.removeMin();
              monitorexit;
            }
            l1 = System.currentTimeMillis();
            l2 = localTimerTask.nextExecutionTime;
            if ((i = (l2 <= l1) ? 1 : 0) != 0)
              if (localTimerTask.period == 0L)
              {
                this.queue.removeMin();
                localTimerTask.state = 2;
              }
              else
              {
                this.queue.rescheduleMin((localTimerTask.period < 0L) ? l1 - localTimerTask.period : l2 + localTimerTask.period);
              }
          }
          if (i == 0)
            this.queue.wait(l2 - l1);
        }
        if (i != 0)
          localTimerTask.run();
      }
      catch (InterruptedException localInterruptedException)
      {
      }
  }
}

2、里面的算法 生产者与消费者模式

3、可能存在的引起的问题就是TimerTask 执行会延迟。

4、TimerTask使用例子及实验测试说明(延迟性)

import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;

public class TestTimer {

/**
  * @param args
  */
 public static void main(String[] args) {
  Timer t = new Timer();
  for(int i=1 ;i<101; i++){   
   MyTimerTask  mtt = new MyTimerTask("线程"+i+": ");
   t.schedule(mtt, 2000);
  }
 }
}

class MyTimerTask extends TimerTask {
 String s;
 public MyTimerTask(String s) {
  this.s = s;
 }
 public void run() {
  try {
   Random random = new Random();
   for (int i = 0; i < 10; i++) {
    int longTime = random.nextInt(10000);
    Thread.sleep(longTime);
    System.out.println(s + i + "  waitTime=" +longTime);
   }
  } catch (Exception e) {
  }

}

}

JAVA Timer 定时器原理相关推荐

  1. JAVA Timer 定时器

    JAVA  Timer 定时器测试 MyTask.java: package com.timer; import java.text.SimpleDateFormat; import java.uti ...

  2. java Timer定时器管理类

    1.java timer类,定时器类.启动执行定时任务方法是timer.schedule(new RemindTask(), seconds*1000);俩参数分别是TimerTask子类,具体执行定 ...

  3. Java Timer定时器 使用

    2019独角兽企业重金招聘Python工程师标准>>> Java 自带的定时器,有两个重要的类:TimerTask和Timer. 如下: 简单的使用: package com;imp ...

  4. Java Timer 定时器的使用

    一.延时执行首先,我们定义一个类,给它取个名字叫TimeTask,我们的定时任务,就在这个类的main函数里执行. 代码如下: package test; import java.util.Timer ...

  5. java timer指定线程池_Java 定时器(Timer)及线程池里使用定时器实例代码

    java Timer定时器 简单实例代码:public class Test { public static void main(String[] args) { // Timer定时器 Timer ...

  6. Java并发编程—定时器Timer底层原理

    原文作者:妮蔻 原文地址:Java并发编程笔记之Timer源码分析 目录 一.timer问题复现 二.Timer 实现原理分析 timer在JDK里面,是很早的一个API了.具有延时的,并具有周期性的 ...

  7. Java的定时器Timer和定时任务TimerTask应用以及原理简析

    记录:272 场景:Java JDK自带的定时器Timer和定时任务TimerTask应用以及原理简析.在JDK工具包:java.util中可以找到源码,即java.util.Timer和java.u ...

  8. java之定时器任务Timer用法

    在项目开发中,经常会遇到需要实现一些定时操作的任务,写过很多遍了,然而每次写的时候,总是会对一些细节有所遗忘,后来想想可能是没有总结的缘故,所以今天小编就打算总结一下可能会被遗忘的小点: 1. pub ...

  9. java项目中多个定时器_在java项目中如何使用Timer定时器

    在java项目中如何使用Timer定时器 发布时间:2020-11-16 16:36:16 来源:亿速云 阅读:97 作者:Leah 在java项目中如何使用Timer定时器?很多新手对此不是很清楚, ...

  10. java timer线程结束_Java线程Timer定时器用法详细总结

    定时/计划功能主要使用的就是Timer对象,它在内部还是使用多线程的方式进行处理,所以它和线程技术还是有非常大的关联. Timer类主要作用就是设置计划任务,但封装任务的类却是TimerTask类.T ...

最新文章

  1. 【转】关于HTTP中文翻译的讨论
  2. 一篇文章解决机器学习,深度学习入门疑惑
  3. Linux系统下手把手完成无人值守安装服务
  4. java基础思维导图
  5. ORACLE+RAC+ASM环境下添加redo日志组
  6. 一 WebService 简介
  7. vue里写三元判断绑定class和style
  8. 17.立体匹配——更好的效果与挑战,总结_5
  9. R语言学习系列(数据挖掘之决策树算法实现--ID3代码篇)
  10. JavaSE基础——方法参数类型及返回值类型问题、权限修饰符、内部类、匿名内部类
  11. 在浏览器环境下,用Excel.js读取excel文件
  12. 登陆界面HTML验证码生成
  13. 【2021-09-22 修订】【梳理】计算机网络:自顶向下方法 第二章 应用层(docx)
  14. Android怎么设置快捷键,Android Studio的快捷键设置方法
  15. 如何让学习像打游戏一样具有成瘾性
  16. 计算机领域中的CAE,什么是CAE?
  17. MYSQL数据库更改目录及NAVACATamp;nbs…
  18. el-tree 默认展开第一级节点
  19. pono2的html5无法显示,ppz
  20. 启动kafka无反应_kafka consumer无法正常启动原因调查

热门文章

  1. android win7共享文件夹,win7系统共享文件夹如何用手机看电脑里面的电影
  2. 用phpstudy安装DVWA
  3. 基于重心法哈特曼波前传感器光斑图像的质心计算
  4. 游戏测试 面试题记录
  5. 一款可以精准爬取网站的网络数据采集系统
  6. java 观察者模式类图_设计模式——观察者模式
  7. 【图像分割】基于matlab最大类间方差法(otsu)图像分割【含Matlab源码 121期】
  8. python svm核函数_Python.SVM(三)核方法
  9. python模拟鼠标点击
  10. DllMain 用法