java中计时器的用法Timer和TimerTask的用法__java中利用Timer与TImerTask 计时器间隔执行任务

简介:
经常我们都会有这样的需求,要固定的 每隔一段时间执行某一个任务。比如:
 
  我们做一个缓存来减少与数据库的交互,而为了使缓存与数据库中的数据尽量达到同步,需要每个固定的一段时间去数据库中的数据是否有更新以达到与缓存的同步。这样的需求可以做一个线程,线程中做一个死循环,循环中就是要执行的这个任务,每执行完一次让线程睡眠一段时间,这要就可以达到这个需求。
 
  但是用最简单最便捷的方式是使用Java为我们提供的计时器的工具类,即Timer和TimerTask。 

      Timer是一个普通的类,其中有几个重要的方法;而TimerTask则是一个抽象类,其中有一个抽象方法run(),类型线程中的run()方法。我们使用Timer创建一个他的对象,然后使用这对象的schedule方法来完成这种间隔的操作。
 
  schedule方法有三个参数,其中第一个参数就是TimerTask类型的对象,我们实现TimerTask的run()方法就是要周期执行的一个任务;第二个参数有两种类型,第一种是long类型,表示多长时间后开始执行,另一种是Date类型,表示从那个时间后开始执行;而第三个参数就是执行的周期,为long类型。
 
  schedule方法还有一种两个参数的执行重载,第一个参数仍然是TimerTask,第二个表示为long的形式表示多长时间后执行一次,为Date就表示某个时间后执行一次。 

    需要注意的是Timer就是一个线程,使用schedule方法完成对TimerTask的调度,多个TimerTask可以共用一个Timer, 也就是说Timer对象调用一次schedule方法就是创建了一个线程,并且调用一次schedule后TimerTask是无限制的循环下去的,使用Timer的cancel()停止操作。当然同一个Timer执行一次cancel()方法后,所有Timer线程都被终止。 

下面是示列代码: 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
java.util.Timer timer =  new  java.util.Timer( true );    
  // true 说明这个timer以daemon方式运行(优先级低,    
  // 程序结束timer也自动结束),注意,javax.swing    
  // 包中也有一个Timer类,如果import中用到swing包,    
  // 要注意名字的冲突。    
         
TimerTask task =  new  TimerTask() {    
     public  void  run() {    
     ...  //每次需要执行的代码放到这里面。    
     }    
};    
         
//以下是几种调度task的方法:       
timer.schedule(task, time);    
// time为Date类型:在指定时间执行一次。    
         
timer.schedule(task, firstTime, period);    
// firstTime为Date类型,period为long    
// 从firstTime时刻开始,每隔period毫秒执行一次。    
         
timer.schedule(task, delay)    
// delay 为long类型:从现在起过delay毫秒执行一次    
         
timer.schedule(task, delay, period)    
// delay为long,period为long:从现在起过delay毫秒以后,每隔period    
// 毫秒执行一次。   

 


完整的示例代码: 
1、定制任务: 

1
2
3
4
5
6
7
8
9
import  java.util.Timer;         
public  class  TimerTaskTest  extends  java.util.TimerTask{   
         
     @Override   
     public  void  run() {   
        // TODO Auto-generated method stub   
        System.out.println( "start" );   
     }   
}   

  



2.调用java.util.Timer : 

1
2
3
4
5
6
7
import  java.util.Timer;         
public  class  Test {   
     public  static  void  main(String[] args){   
         Timer timer =  new  Timer();  
         timer.schedule( new  TimerTaskTest(),  1000 2000 );   
      }   
  }   

 

 

 

 本文转自二郎三郎博客园博客,原文链接:http://www.cnblogs.com/haore147/p/3654113.html,如需转载请自行联系原作者

相关文章
|
23天前
|
缓存 Java 调度
Java并发编程学习10-任务执行与Executor框架
【4月更文挑战第12天】本篇 重点讲解任务执行和 Executor框架的基础知识
25 4
Java并发编程学习10-任务执行与Executor框架
|
13天前
|
Java
Java中return的两种用法
Java中return的两种用法
|
3天前
|
SQL Java
【JAVA进阶篇教学】第九篇:MyBatis-Plus用法介绍
【JAVA进阶篇教学】第九篇:MyBatis-Plus用法介绍
|
3天前
|
缓存 Java 数据库
Java并发编程学习11-任务执行演示
【5月更文挑战第4天】本篇将结合任务执行和 Executor 框架的基础知识,演示一些不同版本的任务执行Demo,并且每个版本都实现了不同程度的并发性。
24 4
Java并发编程学习11-任务执行演示
|
4天前
|
Java API 调度
【Java多线程】Thread类的基本用法
【Java多线程】Thread类的基本用法
6 0
|
12天前
|
存储 Java
java IO接口(Input)用法
【5月更文挑战第1天】Java的`java.io`包包含多种输入输出类。此示例展示了如何使用`FileInputStream`从`input.txt`读取数据。首先创建`FileInputStream`对象,接着创建一个字节数组存储读取的数据,调用`read()`方法将文件内容填充至数组。然后将字节数组转换为字符串并打印,最后关闭输入流。注意,`InputStream`是抽象类,此处使用其子类`FileInputStream`。其他子类如`ByteArrayInputStream`、`ObjectInputStream`和`BufferedInputStream`各有特定用途。
21 2
|
13天前
|
Java
java lambda 表达式中的双冒号和箭头的用法
java lambda 表达式中的双冒号和箭头的用法
|
13天前
|
Java
java中break和continue的用法例子
java中break和continue的用法例子
|
13天前
|
Java 开发者
Java中三种Set的实现类的用法和区别
Java中三种Set的实现类的用法和区别
|
13天前
|
安全 Java
【亮剑】Java中的`Future`接口代表异步计算结果,常与`ExecutorService`配合启动任务并获取结果
【4月更文挑战第30天】Java中的`Future`接口代表异步计算结果,常与`ExecutorService`配合启动任务并获取结果。`Future`接口提供`isDone()`、`get()`、`get(timeout, unit)`和`cancel(mayInterruptIfRunning)`等方法。`FutureTask`是`Future`的实现类,可作为`Runnable`执行并返回结果。