• Java线程:Timer和TimerTask


       Timer和TimerTask可以做为实现线程的第三种方式,前两中方式分别是继承自Thread类和实现Runnable接口。

            Timer是一种线程设施,用于安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行,可以看成一个定时器,可以调度TimerTask。TimerTask是一个抽象类,实现了Runnable接口,所以具备了多线程的能力。

            一个Timer可以调度任意多个TimerTask,它会将TimerTask存储在一个队列中,顺序调度,如果想两个TimerTask并发执行,则需要创建两个Timer。下面来看一个简单的例子:        

    1. import java.util.Timer;  
    2. import java.util.TimerTask;  
    3. public class TimerTest {  
    4.     static class MyTimerTask1 extends TimerTask {  
    5.         public void run() {  
    6.             System.out.println("爆炸!!!");  
    7.         }  
    8.     }     
    9.     public static void main(String[] args) {  
    10.         Timer timer = new Timer();  
    11.         timer.schedule(new MyTimerTask1(), 2000);// 两秒后启动任务  
    12.     }  
    13. }  

            schedule是Timer调度任务的方法,Timer重构了四个schedule方法,具体可以查看JDK API。

            看一个稍复杂的例子,假设有这样一种需求,实现一个连环炸弹,2秒后爆炸一次,3秒后爆炸一次,如此循环下去,这就需要创建两个任务,互相调度,代码如下:

    1. import java.util.Date;  
    2. import java.util.Timer;  
    3. import java.util.TimerTask;  
    4. public class TimerTest {  
    5.     static class MyTimerTask1 extends TimerTask {  
    6.         public void run() {  
    7.             System.out.println("爆炸!!!");  
    8.             new Timer().schedule(new MyTimerTask2(), 2000);  
    9.         }  
    10.     }  
    11.     static class MyTimerTask2 extends TimerTask {  
    12.         public void run() {  
    13.             System.out.println("爆炸!!!");  
    14.             new Timer().schedule(new MyTimerTask1(), 3000);  
    15.         }  
    16.     }  
    17.     public static void main(String[] args) {  
    18.         Timer timer = new Timer();  
    19.         timer.schedule(new MyTimerTask2(), 2000);  
    20.         while(true) {  
    21.             System.out.println(new Date().getSeconds());  
    22.             try {  
    23.                 Thread.sleep(1000);  
    24.             } catch (InterruptedException e) {  
    25.                 // TODO Auto-generated catch block  
    26.                 e.printStackTrace();  
    27.             }  
    28.         }  
    29.     }  
    30. }  

            自JDK5之后,可以用ScheduledThreadPoolExecutor来替代Timer。

  • 相关阅读:
    [转]中英文混合字符截取方法样式表解决方法
    Asp.Net小技巧集合
    [分享]整理后的Discuz!NT 2.0项目源码
    [原创]Web2.0之Tag标签原理实现浅析
    [转]CSS完美兼容IE6/IE7/FF的通用hack方法
    [转]常用CSS缩写语法总结
    文本类文件编码转换器及DiscuzNTdotNet2.0 - -
    [驳]ASP伪静态页简单教程
    SELECT中很多程序都不用的NOLOCK“加锁选项”的功能说明
    iOS 微博 OAuth2.0 分享 文字 + 图片 微博的方法
  • 原文地址:https://www.cnblogs.com/zhangkaimin/p/4501610.html
Copyright © 2020-2023  润新知