• [ImportNew]Java中的Timer类和TimerTask类


    http://www.importnew.com/9978.html

    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的实例。

    MyTimerTask.java

     1 import java.util.Date;
     2 import java.util.Timer;//Timer类在JDK中3个包下都有.这个是util包下的.
     3 import java.util.TimerTask;
     4  
     5 public class MyTimerTask extends TimerTask {
     6  
     7     @Override
     8     public void run() {
     9         System.out.println("Timer task started at:"+new Date());
    10         completeTask();//就是让线程睡两秒
    11         System.out.println("Timer task finished at:"+new Date());
    12     }
    13  
    14     private void completeTask() {
    15         try {
    16             //assuming it takes 20 secs to complete the task
    17             Thread.sleep(20000);
    18         } catch (InterruptedException e) {
    19             e.printStackTrace();
    20         }
    21     }
    22  
    23     public static void main(String args[]){
    24         TimerTask timerTask = new MyTimerTask();
    25         //running timer task as daemon thread
    26         Timer timer = new Timer(true);
    27         timer.scheduleAtFixedRate(timerTask, 0, 10*1000);
    28         System.out.println("TimerTask started");
    29         //cancel after sometime
    30         try {
    31             Thread.sleep(120000);
    32         } catch (InterruptedException e) {
    33             e.printStackTrace();
    34         }
    35         timer.cancel();
    36         System.out.println("TimerTask cancelled");
    37         try {
    38             Thread.sleep(30000);
    39         } catch (InterruptedException e) {
    40             e.printStackTrace();
    41         }
    42     }
    43 }

    输出的结果:

    TimerTask started
    Timer task started at:Sat Mar 07 20:39:24 CST 2015
    Timer task finished at:Sat Mar 07 20:39:44 CST 2015
    Timer task started at:Sat Mar 07 20:39:44 CST 2015
    Timer task finished at:Sat Mar 07 20:40:04 CST 2015
    Timer task started at:Sat Mar 07 20:40:04 CST 2015
    Timer task finished at:Sat Mar 07 20:40:24 CST 2015
    Timer task started at:Sat Mar 07 20:40:24 CST 2015
    Timer task finished at:Sat Mar 07 20:40:44 CST 2015
    Timer task started at:Sat Mar 07 20:40:44 CST 2015
    Timer task finished at:Sat Mar 07 20:41:04 CST 2015
    Timer task started at:Sat Mar 07 20:41:04 CST 2015
    TimerTask cancelled
    Timer task finished at:Sat Mar 07 20:41:24 CST 2015

    public void scheduleAtFixedRate(TimerTask task,long delay,long period)安排指定的任务在指定的延迟后开始进行重复的固定速率执行。以近似固定的时间间隔(由指定的周期分隔)进行后续执行。 task - 所要安排的任务。delay - 执行任务前的延迟时间,单位是毫秒。period - 执行各后续任务之间的时间间隔,单位是毫秒。

    public void cancel()终止此计时器,丢弃所有当前已安排的任务。这不会干扰当前正在执行的任务(如果存在)。一旦终止了计时器,那么它的执行线程也会终止,并且无法根据它安排更多的任务。 

    注意,在此计时器调用的计时器任务的 run 方法内调用此方法,就可以绝对确保正在执行的任务是此计时器所执行的最后一个任务。

    可以重复调用此方法;但是第二次和后续调用无效。

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

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

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

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

  • 相关阅读:
    System Idle Process SYSTEM占用CPU
    apache和nginx的rewrite的区别
    解决file_get_contents failed to open stream: HTTP request failed! 错误
    个人总结大型高并发高负载网站的系统架构(转)
    代码的抽象三原则
    mysqldump导入某库某表的数据
    mysql中insert into和replace into以及insert ignore用法区别
    【原创】学习日记4:nginx负载均衡(二)2012.01.08
    【原创】学习日记1:redis安装以及lnmp环境搭建2012.01.06
    mysql优化 mysql.ini优化
  • 原文地址:https://www.cnblogs.com/DreamDrive/p/4316952.html
Copyright © 2020-2023  润新知