利用ScheduledThreadPoolExecutor定时执行任务

ScheduledThreadPoolExecutor是ThreadPoolExecutor的子类;html

JDK api里是这么说的:java

 

ThreadPoolExecutor,它可另行安排在给定的延迟后运行命令,或者按期执行命令。须要多个辅助线程时,或者要求 ThreadPoolExecutor 具备额外的灵活性或功能时,此类要优于 Timerapi

一旦启用已延迟的任务就执行它,可是有关什么时候启用,启用后什么时候执行则没有任何实时保证。按照提交的先进先出 (FIFO) 顺序来启用那些被安排在同一执行时间的任务。app

---------------ide

平时咱们在执行一个定时任务时,会采用Time,和TimeTask来组合处理;测试

可是Timer和TimerTask存在一些缺陷:spa

1:Timer只建立了一个线程。当你的任务执行的时间超过设置的延时时间将会产生一些问题。.net

2:Timer建立的线程没有处理异常,所以一旦抛出非受检异常,该线程会当即终止。线程

JDK 5.0之后推荐使用ScheduledThreadPoolExecutor。该类属于Executor Framework,它除了能处理异常外,还能够建立多个线程解决上面的问题。code

如下为测试代码:

 

[java] view plain copy

  1. public class TaskTest {  
  2.    static ScheduledThreadPoolExecutor stpe = null;  
  3.    static int index;  
  4.     /** 
  5.      * @param args the command line arguments 
  6.      */  
  7.     public static void main(String[] args) {  
  8.         // TODO code application logic here  
  9.         //构造一个ScheduledThreadPoolExecutor对象,而且设置它的容量为5个  
  10.         stpe = new ScheduledThreadPoolExecutor(5);  
  11.         MyTask task = new MyTask();  
  12. //隔2秒后开始执行任务,而且在上一次任务开始后隔一秒再执行一次;  
  13. //        stpe.scheduleWithFixedDelay(task, 2, 1, TimeUnit.SECONDS);  
  14.         //隔6秒后执行一次,但只会执行一次。  
  15.         stpe.schedule(task, 6, TimeUnit.SECONDS);  
  16.     }  
  17.   
  18.     private static String getTimes() {  
  19.         SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss E");  
  20.         Date date = new Date();  
  21.         date.setTime(System.currentTimeMillis());  
  22.         return format.format(date);  
  23.     }  
  24.   
  25.     private static class MyTask implements Runnable {  
  26.   
  27.         @Override  
  28.         public void run() {  
  29.             index++;  
  30.             System.out.println("2= " + getTimes()+" "  +index);  
  31.             if(index >=10){  
  32.                 stpe.shutdown();  
  33.                 if(stpe.isShutdown()){  
  34.                     System.out.println("中止了????");  
  35.                 }  
  36.             }  
  37.         }  
  38.     }  
  39. }  
相关文章
相关标签/搜索