实现java定时任务

本文中Java定时任务一共有三种,分别是利用Thread类中sleep()方法,Timer与TimerTask类以及ScheduledExecutorService接口来实现延时以及定时任务。

一.<!--[endif]-->

这是最简单的一种方法,通过创建一个Thread类,让其一直在while循环中执行,并通过sleep方法延时一段时间便可以达到定时任务的目的。

简单代码如下:

Java代码 
  1. package pzw.TimedTask;  
  2.   
  3. public class Maintest extends Thread{  
  4.       
  5.     private final int interval = 1000;  
  6.       
  7.     public static void main(String[] args){  
  8.         Maintest mt = new Maintest();  
  9.         mt.start();  
  10.           
  11.     }  
  12.       
  13.     public void run(){  
  14.         while(true){  
  15.             try {  
  16.                 sleep(interval);  
  17.             } catch (InterruptedException e) {  
  18.                 e.printStackTrace();  
  19.             }  
  20.             System.out.println("定时任务已执行!!");  
  21.         }  
  22.     }  
  23.       
  24. }  

而这种方法的缺点也是显而易见的,由于sleep()方法本身的缺陷,导致定时可能会不大精确,同时不方便用户修改启动的delay时间,而且启动与停止任务并不方便控制。

二.Timer类与TimerTask类

该方法通过使用Timer类来启动任务,TimerTask类通过run方法来实现具体的定时任务内容。

这种方法虽然没有之前那种那么简单快速,但明显也多了很多有用的功能,在实现时,Timer类用于调度任务,功能是在指定的时间间隔内反复触发指定窗口的定时器事件,而TimerTask类用于创建一个新线程,执行具体任务。

Java代码 
  1. public static void main(String[] args){  
  2. //      Maintest mt = new Maintest();  
  3. //      mt.start();  
  4.         TimerTask tt = new TimerTask(){  
  5.             public void run(){  
  6.                 //具体任务的操作  
  7.                 System.out.println("定时任务");  
  8.             }  
  9.         };  
  10.         Timer time = new Timer();  
  11.         long delay = 0;  
  12.         long period = 1*1000;  
  13.         time.scheduleAtFixedRate(tt, delay, period);  
  14. }  

 

上面即是使用Timer类与TimerTask类来实现Java定时任务,这种方法的比直接在一个线程中使用sleep()方法无疑功能多了很多,例如,可以控制启动与任务的停止,其次还可以指定任务延时启动。但是由于Timer类使用过的是单线程,在处理需要多个线程同时使用者,有着明显的不足之处,因此,我们可以使用第三种方法ScheduledExecutorService接口

三.ScheduledExecutorService接口

根据我查的资料,ScheduledExecutorService接口是从Java SE 5的java.util.concurrent里,做为并发工具类被引进的,这是最理想的定时任务实现方式。而相较于之前的几种方法,这种方法使用的不是单线程的方法,而是通过使用线程池来执行任务的,那么线程池是什么呢?线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。那么使用线程池的优点有哪些?

1、可以优化资源的使用效率,提高其性能;

2、可以完成需要大量线程的任务;

3、对性能要求苛刻的应用;

4、接受突发性的大量请求,但不至于使服务器因此产生大量线程的应用

 

示例:

Java代码 
  1. Runnable run = new Runnable(){  
  2.             public void run() {  
  3.                 System.out.println("每隔一秒钟输出一次!!!");  
  4.             }  
  5.               
  6.         };  
  7.         //安排延时任务  
  8.         ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();  
  9.         service.scheduleAtFixedRate(run, 01, TimeUnit.SECONDS); 

你可能感兴趣的:(java)