`
zhouxianglh
  • 浏览: 267362 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java.util.Timer 中schedule和scheduleAtFixedRate的区别

    博客分类:
  • J2SE
阅读更多

最近项目中大量用到Timer 总结一下.

schedule安排指定的任务在指定的时间开始进行重复的固定延迟执行

scheduleAtFixedRate安排指定的任务从指定的延迟后开始进行重复的固定延迟执行

参考http://blog.csdn.net/gtuu0123/archive/2010/11/27/6040159.aspx 对schedule和scheduleAtFixedRate的分析.

但它仅仅分析了部分,查看JDK的源代码java.util.Timer分析以下几段:

    public void schedule(TimerTask task, Date firstTime, long period) {
        if (period <= 0)
            throw new IllegalArgumentException("Non-positive period.");
        sched(task, firstTime.getTime(), -period);
    }

 对比

    public void scheduleAtFixedRate(TimerTask task, long delay, long period) {
        if (delay < 0)
            throw new IllegalArgumentException("Negative delay.");
        if (period <= 0)
            throw new IllegalArgumentException("Non-positive period.");
        sched(task, System.currentTimeMillis()+delay, period);
    }

 其调用void java.util.Timer .sched(TimerTask task, long time, long period)  方法,区别仅仅在于period传入方式.

再分析以下代码:

 /**
     * 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-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
                        queue.wait(executionTime - currentTime);
                }
                if (taskFired)  // Task fired; run it, holding no locks
                    task.run();
            } catch(InterruptedException e) {
            }
        }
    }

 以while(true)方式来调用task.run()方法.由此分析TimerTask中的run方法不存在同步的问题 ,如果执行时间超出设置时间,会直接再次执行run()而没有时间间隔!!!!

分享到:
评论

相关推荐

    java.util.timer实现的简单定时任务

    Java.util.Timer类是Java标准库提供的一种简单但功能有限的定时任务执行机制。它允许开发者在指定的时间间隔或特定时间点执行任务,非常适合处理一次性...通过实践和调试,你将更好地理解和掌握Java中的定时任务处理。

    Java Timer:schedule和scheduleAtFixedRate

    总结来说,`Timer` 类的 `schedule` 和 `scheduleAtFixedRate` 方法是Java中进行定时任务调度的关键工具。`schedule` 适合单次延迟执行,而 `scheduleAtFixedRate` 则用于保证任务以固定频率周期性执行。了解并熟练...

    java timer定时器详解(附详细代码)

    Java Timer定时器主要是通过java.util.Timer和java.util.TimerTask两个类来实现的。 Java.util.Timer类 java.util.Timer类是Java Timer定时器的核心类,它可以执行任务并且可以指定任务的执行频率。Timer类有两种...

    使用java.util.Timer实现任务调度

    在Java中,`java.util.Timer` 类提供了一个定时调度任务的简单机制。它与 `java.util.TimerTask` 类配合使用,`TimerTask` 是一个抽象类,代表要定时执行的任务。下面我们将深入探讨这两个类以及如何使用它们实现...

    java在服务启动的时候启动定时器

    在Java中,我们可以使用多种库来实现这个功能,其中最常用的两个是`java.util.Timer`和`java.util.concurrent.ScheduledExecutorService`。 ## 1. `java.util.Timer` `Timer`类是Java标准库中的一个基础定时器,...

    java中的定时器,定时访问某程序等

    Java提供了多种实现定时任务的方式,其中最常用的包括`java.util.Timer`类和`java.util.concurrent.ScheduledExecutorService`接口。本篇文章将深入探讨这两种方法以及它们在实际应用中的使用。 首先,我们来看`...

    java定时执行代码.

    Java提供了多种实现定时任务的机制,这里主要介绍两种:Java.util.Timer类和java.util.concurrent.ScheduledExecutorService接口。 1. Java.util.Timer类: Timer类是Java早期提供的定时任务工具,它可以安排在...

    Java计时器

    在Java中,我们可以使用多种方式来创建计时器,如java.util.Timer类和java.util.concurrentScheduledExecutorService接口。下面将详细介绍这两种方法以及它们的应用场景。 首先,`java.util.Timer` 是Java标准库中...

    java定时执行方法&节拍器

    总结一下,Java中实现定时任务主要依靠`java.util.Timer`、`java.util.concurrent.ScheduledExecutorService`等原生API,以及一些第三方库如Quartz。在实际开发中,选择合适的定时任务解决方案需要考虑项目的复杂性...

    java Schedule

    在Java中,我们可以使用多种库和工具来创建和管理定时任务,如Java的内置API `java.util.Timer` 和 `java.util.concurrent.ScheduledExecutorService`。这两个类提供了丰富的功能,帮助开发者在特定时间或周期性地...

    TimingTrigger

    在Java编程中,`...总结起来,`TimingTrigger`是Java中实现定时触发事件的一种方式,主要依赖`java.util.Timer`和`TimerTask`。通过它们,开发者可以在Eclipse中轻松地创建和管理定时任务,以满足各种定时需求。

    java,javaweb,spring定时器

    在Java世界里,我们有多种实现定时任务的方式,包括Java内置的`java.util.Timer`类和`java.util.concurrent.ScheduledExecutorService`接口。在Web应用中,例如在Java Web项目中,我们可以利用Servlet容器的特性或者...

    java 实现调度器

    这通常是通过Java中的`java.util.Timer`类或者`java.util.concurrent.ScheduledExecutorService`来实现的。这两个工具提供了不同的功能和使用场景,让我们一一进行深入探讨。 首先,我们来看`java.util.Timer`类。...

    Java 定时器程序

    在Java中,我们可以使用`java.util.Timer`类和`java.util.TimerTask`类来实现定时器功能。下面将详细介绍这两个类以及如何使用它们创建一个类似闹钟的定时器程序。 `java.util.Timer`是Java提供的一个线程安全的类...

    Java定时执行某个任务

    这里我们将深入探讨两种主要的方法:Java的`java.util.Timer`类和Java 5及以上版本引入的`java.util.concurrent.ScheduledExecutorService`接口。 首先,我们来了解`java.util.Timer`类。这个类允许开发者创建一个...

    java 写的定时器

    在Java中,有两种主要的定时器类:`java.util.Timer` 和 `java.util.concurrent.ScheduledExecutorService`。本文将详细讲解这两种定时器的用法、优缺点以及如何在实际项目中应用它们。 ### 1. `java.util.Timer` ...

    Java定时器

    `Timer`类位于`java.util`包中,是Java中实现定时任务的核心类。它负责调度任务并在指定的时间点执行它们。要使用`Timer`,首先需要实例化一个`Timer`对象,然后调用`schedule`方法来安排任务的执行。 - **实例化**...

    java计时器代码 可以z在Eclipse下直接运行

    在Java中,我们可以使用`java.util.Timer`类和`java.util.TimerTask`类来创建和管理计时器。下面我们将深入探讨这两个类以及如何在Eclipse环境下编写和运行一个简单的计时器程序。 1. `java.util.Timer` 类: - `...

    javaalert_JAVA源码_

    在Java中,创建一个定时提醒任务通常涉及到使用`java.util.Timer`类或`java.time`包中的定时器功能。让我们深入探讨这个主题。 Java中的定时任务通常用于执行周期性的操作,比如定时发送通知、执行数据备份或在特定...

    Java软件开发实战 Java基础与案例开发详解 12-6 用Timer类调度任务 共6页.pdf

    ### Java软件开发实战:利用...总结来说,`java.util.Timer`类是Java中非常重要的API之一,它简化了定时任务的管理和执行流程。通过理解其核心概念和使用方法,开发者可以在实际项目中更加高效地实现定时任务功能。

Global site tag (gtag.js) - Google Analytics