`
yznxing
  • 浏览: 370445 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

定时执行Timer的源码阅读

    博客分类:
  • java
 
阅读更多

Timer的实现原理:

 

1:timer简介;

 

定制执行一个task,谁用谁知道;

 

2:timer使用

 

 

Timer instance = new Timer(true);

instance .schedule(
          new TimerTask() {
            public void run() {
                  //do something
              }
            }
          }, TimeUnit.NANOSECONDS.toMillis(expirationNanos));
 

 

 

 

3:timerThread

 

timer实现定时主要是靠内部的一个TimerThread无线循环来执行对应的task;

 

TimerThread有一个mainloop;

 

private void mainLoop() {
        while (true) {
            try {
                TimerTask task;
                boolean taskFired;
                synchronized(queue) {
                    // Wait for queue to become non-empty
                    while (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 thing
                    long 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, remove
                                queue.removeMin();
                                task.state = TimerTask.EXECUTED;
                            } else { // Repeating task, reschedule
                                queue.rescheduleMin(
                                  task.period<0 ? currentTime   - task.period
                                                : executionTime + task.period);
                            }
                        }
                    }
                    if (!taskFired) // Task hasn't yet fired; wait

                         //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                         //这个地方是如果执行的task还没到时间就进入等待;

                        queue.wait(executionTime - currentTime);
                }
                if (taskFired)  // Task fired; run it, holding no locks
                    task.run();
            } catch(InterruptedException e) {
            }
        }
    }
 

 

等待主要是靠wait(timeout)来做的;

 

 

 

4:timerQueue

 

对task的管理主要是靠内部的TaskQueue来进行操作的;这个其实是一个有序的queue数据结构;

最上面的就是最近需要进行执行的超时任务,每次都把第一个搞出来进行判断执行,来完成对多任务的组合定时;

就是这个思路;

 

可以看到这个queue每次添加之后都会进行一次排序;

 

/**
     * Adds a new task to the priority queue.
     */
    void add(TimerTask task) {
        // Grow backing store if necessary
        if (size + 1 == queue.length)
	    queue = Arrays.copyOf(queue, 2*queue.length);

        queue[++size] = task;
        fixUp(size);
    }
 

 

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;
        }
    }
 

 

 

ok,简单到这里,终于圆了我看源码的欲望;

 

分享到:
评论

相关推荐

    定时执行程序源码c#开发

    在本文中,我们将深入探讨如何使用C#语言来实现这样的功能,并结合"TimeTask"这一文件名,我们可以推测这是一个关于定时任务实现的源代码示例。 在C#中,我们通常会使用`System.Threading.Timer`类或`System.Timers...

    timer定时运行某段代码(源码,支持VS08版及以上)

    在压缩包中的"timer定时运行某段代码"可能是包含了这个完整应用的源代码文件,可能包括了窗体设计、事件处理等部分,可以作为学习C#定时器使用的一个实例。通过阅读和分析这些源码,开发者可以深入理解`Timer`如何与...

    高精度MFC_Timer定时源码

    在Windows编程环境中,MFC(Microsoft Foundation Classes)库提供了一种方便的方式来处理应用程序中的定时任务。...通过对这些源代码的深入研究,我们可以学到如何优化定时器性能,以及如何在MFC框架下处理定时事件。

    定时执行exe或者bat的源码

    【标题】:“定时执行exe或者bat的源码” 在IT领域,定时执行任务是一个常见的需求,无论是为了自动化工作流程、定期备份数据还是执行系统维护。VB(Visual Basic)是一种流行的编程语言,尤其适合初学者,因为它的...

    Timer控件源码实例

    在处理函数中编写定时执行的代码。 4. 启动Timer:调用Timer的`Start`方法启动计时器,`timer.Start();` 5. 停止Timer:如果需要停止定时器,可以调用`Stop`方法,`timer.Stop();` 在"TimerTest"这个例子中,我们...

    每天定时执行 指定时间执行程序

    这里,我们关注的是如何使用Java和Quartz Timer实现每天定时执行指定的程序。Quartz是一个强大的、完全开源的作业调度框架,它可以用于创建、调度和执行计划任务。 首先,我们要了解Quartz Timer的工作原理。Quartz...

    C#定时器实现自动执行的方法

    //下面讲一个打开窗体定时执行按钮的东西 private void Form1_Load(object sender, EventArgs e) { System.Timers.Timer pTimer = new System.Timers.Timer(5000);//每隔5秒执行一次,没用winfrom自带的 pTimer....

    自动定时运行示例源码

    自动定时运行示例源码 自动定时运行示例(WebForm下timer的使用) 这是一个简单的自动定时运行,通过它,可以做很多需要定时执行的事,比如...在定时执行函数中可以写任何你要定时执行的代码,需要什么应用自己发挥吧

    Win_Timer源代码

    【Win_Timer源代码】是一个与Windows操作系统相关的编程项目,它涉及到使用C++或者C#等编程语言实现的计时器功能。在Windows平台下,开发人员通常会利用系统API或特定库来创建定时器,用于执行周期性的任务或在特定...

    我写的Linux版Timer定时器(源码),可在多线程间使用

    可能使用了POSIX定时器(如`timer_create`、`timer_settime`等系统调用)来实现底层的定时功能,并通过信号量或互斥锁等同步机制来确保在多线程环境中的安全性。开发者可能还实现了一些回调函数,当定时器触发时,...

    PB9多Timer事件实例

    当这个时间间隔过去后,Timer对象会触发Timer事件,我们可以在该事件的处理函数中编写相应的代码来执行我们需要的任务。 在"PB9多Timer事件实例"中,我们可能会遇到如何同时管理多个Timer的情况。这通常涉及到动态...

    模拟时钟源代码C#timer事件

    标题中的“模拟时钟源代码C# timer事件”指的是使用C#编写的一个程序,该程序通过Timer控件实现了类似实际时钟的功能,并且利用Timer事件来更新时间显示。C# Timer控件是基于Windows Forms平台的一个组件,它并不像...

    c# 定时提醒 源代码

    本项目提供了一种实现C#定时提醒的源代码,包含了两种不同的方法。以下将详细介绍这两种方法及其相关知识点。 1. **System.Timers.Timer** `System.Timers.Timer` 是 .NET Framework 提供的一个类,它允许开发人员...

    Java定时执行某个任务

    总结起来,Java提供了`Timer`和`ScheduledExecutorService`两种方式来实现定时执行任务。`Timer`适合简单的定时任务,而`ScheduledExecutorService`更适合复杂的需求,如多线程环境和高并发场景。选择哪种方式取决于...

    dingshiqi.rar_timer_定时功能_定时器 源代码

    本文将深入探讨“dingshiqi.rar_timer_定时功能_定时器 源代码”提供的源代码,讲解其中包含的定时器设计原理和实现方式。 首先,我们要理解定时器的基本概念。定时器是一种能够按照预设时间间隔触发事件或执行特定...

    Timer简单程序代码

    在“Timer”的压缩文件中,我们可以推测它可能包含了一个或多个实现定时器功能的源代码文件。这些文件可能包含了不同编程语言的实现,或者是针对同一语言的不同设计模式或使用场景的示例。 接下来,我们将深入探讨...

    timer_timer_源码

    标题“timer_timer_源码”表明我们将探讨一个关于定时器的源代码实现,这可能是某个编程语言中的一个库或者框架。描述中的“good timer for use in your life”暗示了这是一个对日常生活有实际应用价值的定时器设计...

    C#定时计时器源代码

    综上所述,这个“C#定时计时器源代码”项目涉及了C#中的时间计算、定时触发事件以及如何在程序中正确管理和使用Timer组件。通过学习和理解这些知识点,开发者可以创建自己的定时任务,用于自动化、提醒或其他需要...

    threading.timer 实例项目源代码

    4. 定时任务执行完毕后,Timer对象不会自动销毁,如果需要停止定时器,可以调用`cancel()`方法。 在`threading.timer_test`脚本中,可能包含以下内容: - 多个定时任务的创建和执行,展示如何设置不同的延迟时间。 ...

    JAVA定时关机程序源代码

    这个"JAVA定时关机程序源代码"是一个很好的学习资源,特别是对于初学者来说,它能深入理解Java语言的基础和高级特性。 首先,我们需要了解Java中的定时任务。Java提供了多种实现定时任务的方式,如java.util.Timer...

Global site tag (gtag.js) - Google Analytics