利用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. }  
相關文章
相關標籤/搜索