Java中的定时器Timer

 

  java.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方法来调度任务。

  如下是一个使用Timer和TimerTask的实例:

package com.journaldev.threads;

import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class MyTimerTask extends TimerTask {

    @Override
    public void run() {
        System.out.println("Timer task started at:"+new Date());
        completeTask();
        System.out.println("Timer task finished at:"+new Date());
    }

    private void completeTask() {
        try {
            //assuming it takes 20 secs to complete the task
            Thread.sleep(20000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void main(String args[]){
        TimerTask timerTask = new MyTimerTask();
        //running timer task as daemon thread
        Timer timer = new Timer(true);
        timer.scheduleAtFixedRate(timerTask, 0, 10*1000);
        System.out.println("TimerTask started");
        //cancel after sometime
        try {
            Thread.sleep(120000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        timer.cancel();
        System.out.println("TimerTask cancelled");
        try {
            Thread.sleep(30000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

  注意,一个线程执行花费20秒,但Timer对象每10秒就调度一次任务。如下是程序的输出。

TimerTask started
Timer task started at:Mon Mar 03 12:58:24 CST 2014
Timer task finished at:Mon Mar 03 12:58:44 CST 2014
Timer task started at:Mon Mar 03 12:58:44 CST 2014
Timer task finished at:Mon Mar 03 12:59:04 CST 2014
Timer task started at:Mon Mar 03 12:59:04 CST 2014
Timer task finished at:Mon Mar 03 12:59:24 CST 2014
Timer task started at:Mon Mar 03 12:59:24 CST 2014
Timer task finished at:Mon Mar 03 12:59:44 CST 2014
Timer task started at:Mon Mar 03 12:59:44 CST 2014
Timer task finished at:Mon Mar 03 13:00:04 CST 2014
Timer task started at:Mon Mar 03 13:00:04 CST 2014
TimerTask cancelled
Timer task finished at:Mon Mar 03 13:00:24 CST 2014

  输出结果证实,如果一个任务已经执行,Timer将等待它执行结束,一旦任务执行结束,Timer对象将再次启动队列中的下一个任务。

  Timer对象可作为一个守护线程运行相关的任务。Timer的cancel()方法用于终止计时器,并丢弃待调度的任务。然而,Timer不会干扰当前执行的任务,并且让它执行结束。如果计时器用于执行守护线程,无论是否取消它,它都会等待所有用户线程结束后终止。

  Timer类包含一些sechedule()方法用于调度一个任务在指定时间运行一次或者延时之后运行。还有一些scheduleAtFixedRate()方法用于在一定间隔后周期运行任务

  当使用Timer调度任务时,必须确保时间间隔超过正常程序运行时间,否则任务队列的大小将持续增长,最终程序将无法停止。

   

  原文链接: journaldev 翻译: ImportNew.com - liken
  译文链接: http://www.importnew.com/9978.html
  [ 转载请保留原文出处、译者和译文链接。]

时间: 2024-08-13 14:22:24

Java中的定时器Timer的相关文章

java中的定时器——Timer

一.类概述 Timer是一种定时器工具,用来在一个后台线程计划执行指定任务.它可以计划执行一个任务一次或反复多次. TimerTask一个抽象类,它的子类代表一个可以被Timer计划的任务. 二.代码实例 import java.util.Timer; import java.util.TimerTask; public class Reminder ...{ Timer timer; public Reminder(int seconds) ...{ timer = new Timer();

Java中的定时器

注意:内容来自网络他人文章,特此声明 一.Java中的定时器 在JAVA中实现定时器功能要用的2个重要类是 Timer类:定时器类,需要一个TimerTask类的实例作为参数: TimerTask:定时器任务类,定时器要执行的任务在该类的run方法中定义. 二.实现定时器的两种写法 1.普通实现(相对于通过内部类来实现而言) 1 //先写一个类 2 public class TimeTest { 3 public static void main(String[] args) { 4 5 Tim

JAVA中一些定时器的使用

一:简单说明 ScheduleExecutorService接口中有四个重要的方法,其中scheduleAtFixedRate和scheduleWithFixedDelay在实现定时程序时比较方便. 下面是该接口的原型定义 java.util.concurrent.ScheduleExecutorService extends ExecutorService extends Executor 接口scheduleAtFixedRate原型定义及参数说明 [java] view plain cop

[ Javascript ] JavaScript中的定时器(Timer) 是如何工作的!

作为入门者来说,了解JavaScript中timer的工作方式是很重要的.通常它们的表现行为并不是那么地直观,而这是因为它们都处在一个单一线程中.让我们先来看一看三个用来创建以及操作timer的函数. var id = setTimeout(fn, delay); - 初始化一个单一的timer,这个timer将会在一定延时后去调用指定的函数.这个函数(setTimeout)将返回一个唯一的ID,我们可以通过这个ID来取消timer. var id = setInterval(fn, delay

java中定时器的应用实例

1 package com.xiangshang.listener; 2 3 import java.util.Timer; 4 import java.util.TimerTask; 5 6 import javax.servlet.ServletContextEvent; 7 import javax.servlet.ServletContextListener; 8 9 public class MyTimerListener implements ServletContextListen

多线程中sleep和wait的区别,以及多线程的实现方式及原因,定时器--Timer

1.  Java中sleep和wait的区别 ① 这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类. sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用b的sleep方法,实际上还是a去睡觉,要让b线程睡觉要在b的代码中调用sleep. ② 锁: 最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法. sleep不出让系统资源:wait是进入线程等待池等待,出让系统资源,其他线程可以占用C

定时任务:Java中Timer和TimerTask的使用

java.util.Timer定时器,实际上是个线程,定时调度所拥有的TimerTasks. 一个TimerTask实际上就是一个拥有run方法的类,需要定时执行的代码放到run方法体内,TimerTask一般是以匿名类的方式创建. 一个完整的Timer: Java代码   java.util.Timer timer = new java.util.Timer(true); // true 说明这个timer以daemon方式运行(优先级低, // 程序结束timer也自动结束),注意,java

JAVA多线程提高一:传统线程技术&传统定时器Timer

前面我们已经对多线程的基础知识有了一定的了解,那么接下来我们将要对多线程进一步深入的学习:但在学习之前我们还是要对传统的技术进行一次回顾,本章我们回顾的则是:传统线程技术和传统的定时器实现. 一.传统线程技术 1.创建方式 1.继承thread类 Thread t = new Thread(){ @Override public void run() { } }; t.start(); 2.实现Runnable接口 Thread t1 = new Thread(new Runnable() {

qt中定时器Timer的使用

qt中定时器Timer的使用,布布扣,bubuko.com