JAVA Timer 定时器原理
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 定时器原理相关推荐
- JAVA Timer 定时器
JAVA Timer 定时器测试 MyTask.java: package com.timer; import java.text.SimpleDateFormat; import java.uti ...
- java Timer定时器管理类
1.java timer类,定时器类.启动执行定时任务方法是timer.schedule(new RemindTask(), seconds*1000);俩参数分别是TimerTask子类,具体执行定 ...
- Java Timer定时器 使用
2019独角兽企业重金招聘Python工程师标准>>> Java 自带的定时器,有两个重要的类:TimerTask和Timer. 如下: 简单的使用: package com;imp ...
- Java Timer 定时器的使用
一.延时执行首先,我们定义一个类,给它取个名字叫TimeTask,我们的定时任务,就在这个类的main函数里执行. 代码如下: package test; import java.util.Timer ...
- java timer指定线程池_Java 定时器(Timer)及线程池里使用定时器实例代码
java Timer定时器 简单实例代码:public class Test { public static void main(String[] args) { // Timer定时器 Timer ...
- Java并发编程—定时器Timer底层原理
原文作者:妮蔻 原文地址:Java并发编程笔记之Timer源码分析 目录 一.timer问题复现 二.Timer 实现原理分析 timer在JDK里面,是很早的一个API了.具有延时的,并具有周期性的 ...
- Java的定时器Timer和定时任务TimerTask应用以及原理简析
记录:272 场景:Java JDK自带的定时器Timer和定时任务TimerTask应用以及原理简析.在JDK工具包:java.util中可以找到源码,即java.util.Timer和java.u ...
- java之定时器任务Timer用法
在项目开发中,经常会遇到需要实现一些定时操作的任务,写过很多遍了,然而每次写的时候,总是会对一些细节有所遗忘,后来想想可能是没有总结的缘故,所以今天小编就打算总结一下可能会被遗忘的小点: 1. pub ...
- java项目中多个定时器_在java项目中如何使用Timer定时器
在java项目中如何使用Timer定时器 发布时间:2020-11-16 16:36:16 来源:亿速云 阅读:97 作者:Leah 在java项目中如何使用Timer定时器?很多新手对此不是很清楚, ...
- java timer线程结束_Java线程Timer定时器用法详细总结
定时/计划功能主要使用的就是Timer对象,它在内部还是使用多线程的方式进行处理,所以它和线程技术还是有非常大的关联. Timer类主要作用就是设置计划任务,但封装任务的类却是TimerTask类.T ...
最新文章
- 【转】关于HTTP中文翻译的讨论
- 一篇文章解决机器学习,深度学习入门疑惑
- Linux系统下手把手完成无人值守安装服务
- java基础思维导图
- ORACLE+RAC+ASM环境下添加redo日志组
- 一 WebService 简介
- vue里写三元判断绑定class和style
- 17.立体匹配——更好的效果与挑战,总结_5
- R语言学习系列(数据挖掘之决策树算法实现--ID3代码篇)
- JavaSE基础——方法参数类型及返回值类型问题、权限修饰符、内部类、匿名内部类
- 在浏览器环境下,用Excel.js读取excel文件
- 登陆界面HTML验证码生成
- 【2021-09-22 修订】【梳理】计算机网络:自顶向下方法 第二章 应用层(docx)
- Android怎么设置快捷键,Android Studio的快捷键设置方法
- 如何让学习像打游戏一样具有成瘾性
- 计算机领域中的CAE,什么是CAE?
- MYSQL数据库更改目录及NAVACATamp;nbs…
- el-tree 默认展开第一级节点
- pono2的html5无法显示,ppz
- 启动kafka无反应_kafka consumer无法正常启动原因调查