zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    Linux指令面试题01-进程查看与终止
    微信网页授权
    腾讯视频怎么转成mp4模式 软件 工具 方法 最新【已解决】
    表操作,多对一、多对多、一对一
    初识数据库,基础sql语句
    IO多路复用
    协程:gevent
    线程:threading
    进程:multiprocessing
    利用socket与ssl模块读取网页内容
  • 原文地址:https://www.cnblogs.com/zhangkaimin/p/4501610.html
Copyright © 2011-2022 走看看