`

Java_Timer

    博客分类:
  • Java
 
阅读更多

ref: http://blog.csdn.net/eg366/article/details/11836017

 

Java_Timer

 

ava.util.Timer是一个实用工具类,该类用来调度一个线程,使它可以在将来某一时刻执行。 Java的Timer类可以调度一个任务运行一次,或定期运行。

 

java.util.TimerTask是一个抽象类,它实现了Runnable接口。我们需要扩展该类以便创建自己的TimerTask,这个TimerTask内部使用java Timer类,可以被调度。

 

Timer类是线程安全的,多进程不需要外部同步机制就可以共享同一个Timer对象。Timer类使用java.util.TaskQueue在指定时间间隔添加任务,在任何时刻只能有一个线程执行TimerTask。例如,创建一个每10秒运行的Timer,但单个线程的执行时间花费20秒,Timer对象将持续将任务添加到队列,一旦有任务结束,它就会通知队列,并且另外一个线程将启动执行。

 

Timer类使用对象的wait和notify方法来调度任务。

 

一、调用方法:

 

(1)void java.util.Timer.schedule(TimerTask task, long delay):多长时间(毫秒)后执行任务

(2)void java.util.Timer.schedule(TimerTask task, Date time):设定某个时间执行任务

(3)void java.util.Timer.schedule(TimerTask task, long delay, long period):delay时间后开始执行任务,并每隔period时间调用任务一次。

(4)void java.util.Timer.schedule(TimerTask task, Date firstTime, long period):第一次在指定firstTime时间点执行任务,之后每隔period时间调用任务一次。

(5)void java.util.Timer.scheduleAtFixedRate(TimerTask task, long delay, long period):delay时间后开始执行任务,并每隔period时间调用任务一次。

(6)void java.util.Timer.scheduleAtFixedRate(TimerTask task, long delay, long period):第一次在指定firstTime时间点执行任务,之后每隔period时间调用任务一次。

void java.util.Timer.cancel():终止该Timer

boolean java.util.TimerTask.cancel():终止该TimerTask

可以为每个Timer指定多个TimerTask

虽然可通过void java.util.Timer.schedule(TimerTask task, Date firstTime, long period)方法完成“例如:每天上午10点执行一次”的业务,但该实现是基于进行一天(1000 * 60 * 60 * 24毫秒)进行延迟的机制实现的,并不是指定某个具体时间进行执行的。

对于该种需求,可通过Quartz来进行实现

 

二、方法名称schedule()和scheduleAtFixedRate()两者的区别

当需要根据period区间时间循环多次调用任务的时候,会存在两种不同的策略,两种方法提供了不同的策略。

调用方法(1)、(2)只是单次执行,不存在多次调用任务的情况,所以没有提供scheduleAtFixedRate方法的调用方式。

<1>schedule()方法更注重保持间隔时间的稳定:保障每隔period时间可调用一次

<2>scheduleAtFixedRate()方法更注重保持执行频率的稳定:保障多次调用的频率趋近于period时间,如果某一次调用时间大于period,下一次就会尽量小于period,以保障频率接近于period

 

 

三、示例

 

(1)

 

/** 

 * 第一种方法:设定多长时间(毫秒)后执行任务 

 */  

public static void timer1() {  

    final StopWatch watch = new StopWatch();  

    watch.start();  

    Timer timer = new Timer();  

    /* void java.util.Timer.schedule(TimerTask task, long delay) */  

    timer.schedule(new TimerTask() {  

        public void run() {  

            watch.stop();  

            System.out.println("-------任务执行--------");  

            System.out.println(watch.getTime());  

        }  

    }, 2000);// delay=2000毫秒 后执行该任务  

}  

(2)

 

/** 

 * 第二种方法:设定某个时间执行任务 

 */  

public static void timer2() {  

    Calendar calendar = new GregorianCalendar();  

    calendar.add(Calendar.MINUTE, 1);  

    calendar.set(Calendar.SECOND, 0); // 一分钟后执行  

    Timer timer = new Timer();  

    /* void java.util.Timer.schedule(TimerTask task, Date time) */  

    timer.schedule(new TimerTask() {  

        @Override  

        public void run() {  

            System.out.println("-------任务执行--------");  

        }  

    }, calendar.getTime());  

}  

(3)

 

/** 

 * 第三种方法:设定指定任务task在指定延迟delay后进行固定延迟peroid的执行 

 */  

public static void timer3() {  

    Timer timer = new Timer();  

    final StopWatch watch = new StopWatch();  

    watch.start();  

    System.out.println(Thread.currentThread().getName());  

    /* 

     * void java.util.Timer.schedule(TimerTask task, long delay, long 

     * period) 

     */  

    timer.schedule(new TimerTask() {  

        public void run() {  

            /* 子线程进行任务的执行 */  

            System.out.println(Thread.currentThread().getName());  

            System.out.println("-------设定要指定任务--------");  

            watch.suspend();  

            System.out.println(watch.getTime());  

            watch.reset();  

            watch.start();  

        }  

    }, 1000, 1000);  

}  

(4)

 

/** 

 * 固定延迟peroid时间后执行;peroid时间不是以任务执行完的时间为计算起点(某次任务执行完成后,经过peroid时间后再次调用[不是这样的])。 

 * 而是每隔peroid时间调用任务一次。当任务执行的时间小于peroid时间,可以保证每隔peroid时间调用一次。 

 * 当任务的执行时间大于peroid时间时,从现象上看:任务一执行完,就会立刻进入下一次任务的执行 

 */  

public static void timer3a() {  

    Timer timer = new Timer();  

    final StopWatch watch = new StopWatch();  

    watch.start();  

    timer.schedule(new TimerTask() {  

        Integer i = 1;  

        public void run() {  

            System.out.println(watch.getTime());  

            System.out.println("########第" + i + "次执行开始########");  

            try {  

                Thread.sleep(400);  

            } catch (InterruptedException e) {  

                e.printStackTrace();  

            }  

            System.out.println("########第" + i + "次执行结束########");  

            i++;  

            watch.reset();  

            watch.start();  

        }  

    }, 1000, 500);  

}  

period:500毫秒;每次任务执行时间400毫秒;所以每次任务执行完成后到下一次任务调用开始的时间趋近于100毫秒

 

打印日志信息:

 

1000  

########第1次执行开始########  

########第1次执行结束########  

109  

########第2次执行开始########  

########第2次执行结束########  

93  

########第3次执行开始########  

########第3次执行结束########  

93  

########第4次执行开始########  

########第4次执行结束########  

93  

########第5次执行开始########  

########第5次执行结束########  

93  

########第6次执行开始########  

########第6次执行结束########  

93  

########第7次执行开始########  

########第7次执行结束########  

93  

########第8次执行开始########  

当将Thread.sleep(400);修改为Thread.sleep(600)时:

打印日志信息:

 

 

1000  

########第1次执行开始########  

########第1次执行结束########  

0  

########第2次执行开始########  

########第2次执行结束########  

0  

########第3次执行开始########  

########第3次执行结束########  

0  

########第4次执行开始########  

########第4次执行结束########  

0  

########第5次执行开始########  

 

 

public class MyTimerTask extends TimerTask {

 

@Override

public void run() {

System.out.println("Timer task started at:"+new Date());

System.out.println("do something...");

        System.out.println("Timer task finished at:"+new Date());

 

}

 

public static void main(String[] args) {

TimerTask timerTask = new MyTimerTask();

        Timer timer = new Timer();

        timer.schedule(timerTask, 0, 2000);

}

}

 

 

 

(5)

 

/** 

 * 第四种方法:安排指定的任务task在指定的时间firstTime开始进行重复的固定速率period执行 

 * 每天中午12点都执行一次 

 */  

public static void timer4() {  

    Calendar calendar = Calendar.getInstance();  

    calendar.set(Calendar.HOUR_OF_DAY, 12); // 控制时  

    calendar.set(Calendar.MINUTE, 0); // 控制分  

    calendar.set(Calendar.SECOND, 0); // 控制秒  

  

    Date time = calendar.getTime(); // 得出执行任务的时间,此处为今天的12:00:00  

  

    Timer timer = new Timer();  

    /* void java.util.Timer.schedule(TimerTask task, Date firstTime, long period) */  

    timer.schedule(new TimerTask() {  

        public void run() {  

            System.out.println("-------设定要指定任务--------");  

        }  

    }, time, 1000 * 60 * 60 * 24);// 这里设定将延时每天固定执行  

}  

(6)

 

/** 

 * 第五种方法:设定指定任务task在指定延迟delay后进行固定频率peroid的执行。 

 * timer.schedule和timer.scheduleAtFixedRate的区别: 

 * (1)schedule()方法更注重保持间隔时间的稳定:保障每隔period时间可调用一次 

 * (2)scheduleAtFixedRate()方法更注重保持执行频率的稳定:保障多次调用的频率趋近于period时间,如果某一次调用时间大于period,下一次就会尽量小于period,以保障频率接近于period 

 */  

public static void timer5() {  

    Timer timer = new Timer();  

    /* void java.util.Timer.scheduleAtFixedRate(TimerTask task, long delay, long period) */  

    timer.scheduleAtFixedRate(new TimerTask() {  

        public void run() {  

            System.out.println("-------设定要指定任务--------");  

        }  

    }, 1000, 500);  

}  

分享到:
评论

相关推荐

    java_Timer定时器实例_Spring实例

    标题与描述均提到了“Java_Timer定时器实例_Spring实例”,这表明文章主要讨论的是如何在Java中使用Timer类创建定时任务,并将其整合到Spring框架中。以下是对该主题的详细解析: ### Java中的Timer定时器 #### ...

    java_Timer_thread.rar_java thread timer_java timer_java 定时器_java

    Java中的定时器(Timer)是Java.util包下用于执行定期任务的一个类,它与线程(Thread)紧密关联,能够帮助开发者实现定时执行特定任务的需求。这个机制在多线程编程(multithreading)中非常有用,特别是在需要定期...

    Timer-java.rar_java timer_timer_timer java

    在Java编程语言中,`Timer`类是Java.util包下的一个关键组件,它主要用于调度周期性的任务执行。这个`Timer`类提供了定时器的功能,能够按照预设的时间间隔执行任务,比如更新UI、执行定时检查等。在描述中提到的是...

    sample-Timer.rar_Timer ja_mftimer_timer java

    在Java ME(Micro Edition)平台中,`Timer`类是一个重要的工具,用于执行定期的、重复的任务。在游戏开发和需要定时事务处理的场景中,`Timer`的使用显得尤为重要。`sample-Timer.rar`提供的示例代码展示了如何在...

    timeclck.rar_timer java_计时器_计时器代码

    在Java编程语言中,`Timer`类是Java.util包下的一个关键组件,它允许程序员创建和管理定时任务。本项目中的"Timeclck.rar"压缩包包含了一个名为"Game.java"的源代码文件,以及一个看似无关的"www.pudn.com.txt"文本...

    j_13945_Timer.rar 语音报时

    1. **计时器编程**:计时器在软件开发中通常由编程语言中的特定库或API实现,如Java的Timer类,JavaScript的setInterval函数,或是C#的System.Timers.Timer。开发者会设定一个计时间隔,当达到该间隔时触发事件。 2...

    timer_timer_源码

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

    Java--Timer--TimerTask--.rar_java timer

    在Java编程语言中,`Timer`和`TimerTask`是两个关键类,它们用于调度周期性的任务执行。这两个类在多线程环境下尤其有用,能够帮助开发者安排在将来某一特定时间或定期执行的任务。让我们深入了解一下`Timer`和`...

    java_game_10.rar_java_java 开发_java 游戏 源码_游戏开发

    5. **动画与定时器**:如何实现平滑的动画效果,以及使用Timer类或Thread.sleep()进行延迟执行。 6. **数据结构与算法**:例如使用数组、列表、队列或栈来存储游戏状态,或者应用搜索、排序等算法优化游戏逻辑。 7. ...

    jonas_timer-1.4.3.jar 、jotm-1.4.3.jar、jta-1.0.1B.jar

    标题中的三个文件——"jonas_timer-1.4.3.jar"、"jotm-1.4.3.jar"和"jta-1.0.1B.jar",是Java开发中的关键组件,主要用于分布式事务处理和定时任务管理。在Java应用程序中,特别是企业级应用,这些库文件扮演着至关...

    Java_End_Exam_java作业_时钟设计java_

    此外,`java.util.Timer`或`java.time`包下的API(如`LocalTime`)也可以用于获取和显示当前时间。为了实现用户界面,开发者可能会选择使用Swing或JavaFX库,它们提供了丰富的组件和布局管理器来构建图形用户界面...

    ProgramabilniTajmer_timer_

    在IT领域,"Programabilni Tajmer_timer_" 可能是指一种可编程计时器软件或硬件设备。这种工具允许用户根据特定需求设置定时任务,从而实现自动化操作。以下是一些关于可编程计时器及其相关知识点的详细介绍: 1. *...

    jwood-standup-timer_java_

    标题“jwood-standup-timer_java_”指的是一个基于Java开发的名为“Standup Timer”的应用程序。这个程序专门设计用于管理站立会议,也就是敏捷开发中的日常站会(Daily Standup Meeting)。站会通常是为了让团队...

    JAVA_API1.6文档(中文)

    javax.management.timer 提供对 Timer MBean(计时器 MBean)的定义。 javax.naming 为访问命名服务提供类和接口。 javax.naming.directory 扩展 javax.naming 包以提供访问目录服务的功能。 javax.naming.event ...

    android_timer_倒數計時

    在这个名为"android_timer_倒數計時"的简单示例中,我们将深入探讨如何在Android应用中创建一个倒计时器。 首先,`CountDownTimer`类是`java.util.Timer`类的一个子类,它提供了一个更加面向对象的计时接口。创建一...

    java_clock.rar_Java 闹钟代码_闹钟

    在Java中,我们可以使用`java.util.Timer`类或`java.util.concurrent.ScheduledExecutorService`来创建定时任务,执行特定的代码,比如播放闹钟声音、显示提醒等。`Timer`类提供了`schedule()`和`...

    java定时器timer制作

    private void Form_Timer_Tick(object sender, EventArgs e) { label1.Text = (++num).ToString(); Thread.Sleep(3000); // 注意:这种方式会导致UI卡顿 } ``` #### 2. System.Threading.Timer - **特点**: ...

    java中timer用法

    不过,标准的调度类 Timer 和 TimerTask 没有足够的灵活性,无法支持通常需要的计划任务类型。在本文中,Java 开发人员 Tom White 向您展示了如何构建一个简单通用的计划框架,以用于执行任意复杂的计划任务。

    Java_Pintu_Applet.rar_applet_java 开发 拼图游戏_java拼图游戏_拼图 java_用java

    6. **动画和定时器**:为了实现动态效果,如拼图块的平滑移动,可以使用`javax.swing.Timer`或者异步编程来控制间隔执行的任务。 7. **网络编程**:如果游戏是从服务器下载或上传成绩,那么可能需要使用`java.net`...

    Define-a-timer.rar_timer 串口

    在各种编程语言中,如C++、Java、Python等,都有内置的定时器库或者API供开发者使用。例如,Windows操作系统提供了SetTimer API,而在Linux中,可以使用POSIX的alarm、setitimer等功能。在这些定时器中,我们可以...

Global site tag (gtag.js) - Google Analytics