美文网首页
java定时器Timer基本原理

java定时器Timer基本原理

作者: 深谷9002 | 来源:发表于2018-09-18 11:11 被阅读0次

Timer总结

Timer是jdk自带的定时器,可以实现单机基本的定时任务, 从指定时间开始,每隔一段时间固定执行等等;它主要具有以下特性

1.单线程同步处理所有任务(TimerTask), 所以任务真正执行的时间点可能和预定的有延迟(因为有可能被前面的任务给耽误了)

2.只要有任务在执行时抛出了异常(InterruptedException除外的所有异常),整个Timer被停止,所有任务也被停止;

3.任务队列基于优先队列,二叉堆来实现的,以保证任务总体上的有序执行

Timer两个重要的成员变量

TimerThread实例对象,实现主循环,选择一个最近要执行的任务进行执行

TaskQueue实例对象,实现了任务队列, 内部实现是优先队列的数据结构

private final TaskQueuequeue =new TaskQueue();

private final TimerThreadthread =new TimerThread(queue);

Timer初始化

通过构造函数在实例化的时候即启动内部线程类TimerThread

public Timer(String name, boolean isDaemon) {

    thread.setName(name);

    thread.setDaemon(isDaemon);

    thread.start();

TimerThread线程启动后调用 mainLoop 一直尝试从优先队列里获取任务(最先待执行的任务)

当队列为空时主循环就一直wait();

当队列不为空时,取队头的任务(即堆顶)并比较任务的执行时间nextExecutionTime与当前时间currentTime,如果时间未到则需要阻塞等待 queue.wait(executionTime - currentTime);

class TimerThreadextends Thread {

    private TaskQueuequeue;

    TimerThread(TaskQueue queue) {

       this.queue = queue;

    }

public void run() {

     try {

          mainLoop();

        }finally {

            。。。

      }

}

/**

* The main timer loop.  (See class comment.)

*/

private void mainLoop() {

   while (true) {

     try {

     ....主循环,一直尝试获取任务...

         if (!taskFired) queue.wait(executionTime - currentTime);

     .......

         if (taskFired) task.run();

     }catch(InterruptedException e) {

    }

}

Timer添加任务

添加的任务都是TimerTask的子类,类似schedule(TimerTask xxx), 即往TaskQueue队列里添加任务, 当发现队列里面刚刚没有数据时则进行notify, 以便唤醒TimerThread继续执行; 见加粗代码部分

添加任务操作最终都会调用 private void sched(TimerTask task, long time, long period)

private void sched(TimerTask task, long time, long period) {

if (time <0)

throw new IllegalArgumentException("Illegal execution time.");

    // Constrain value of period sufficiently to prevent numeric

// overflow while still being effectively infinitely large.

    if (Math.abs(period) > (Long.MAX_VALUE >>1))

period >>=1;

    synchronized(queue) {

if (!thread.newTasksMayBeScheduled)

throw new IllegalStateException("Timer already cancelled.");

        synchronized(task.lock) {

if (task.state != TimerTask.VIRGIN)

throw new IllegalStateException(

"Task already scheduled or cancelled");

            task.nextExecutionTime = time;

            task.period = period;

            task.state = TimerTask.SCHEDULED;

        }

queue.add(task);

        if (queue.getMin() == task)

queue.notify();

    }

}

相关文章

  • java中的定时器

    1、java中普通定时任务 Timer定时器 ScheduledThreadPoolExecutor 定时器 Ti...

  • Java可自定义中断定时器的实现

    Java定时器的实现一般使用的是Timer和ScheduledExecutorService 使用Timer的时候...

  • java定时器Timer基本原理

    Timer总结 Timer是jdk自带的定时器,可以实现单机基本的定时任务, 从指定时间开始,每隔一段时间固定执行...

  • 【golang】定时器的使用

    一.一次性定时器Timer,定时器停止timer.Stop(),定时器重置timer.Reset() 二.周期定时...

  • Java 定时器

    Java 定时器 1. 概述 Timer 可以按计划执行重复的任务或者定时执行指定任务,这是因为 Timer 内部...

  • 多线程之定时器任务

    在java中Timer是java.util包中的一个工具类,提供了定时器的功能。我们可以创建一个Timer对象,然...

  • 定时器(Quartz) [kwɔːts]

    Quartz定时器就是对java中Timer定时器的封装,支持Cron表达式定时 使用步骤: 1.定义任务类(指定...

  • Timer定时器

    Timer定时器

  • 定时器 Timer

    定时器 Timer [toc] 定时器 Timer 的使用 Timer 类主要负责计划任务的功能,也就是在指定时间...

  • Kafka技术内幕: 层级时间轮

    层级时间轮 3.4.4 定时器Timer 那么Kafka的Timer定时器是如何存储DelayedOperatio...

网友评论

      本文标题:java定时器Timer基本原理

      本文链接:https://www.haomeiwen.com/subject/rjoynftx.html