使用java自帶的定時任務ScheduledThreadPoolExecutor

ScheduledThreadPoolExecutor是ThreadPoolExecutor的子類;html

JDK api裏是這麼說的:java

 

ThreadPoolExecutor,它可另行安排在給定的延遲後運行命令,或者按期執行命令。須要多個輔助線程時,或者要求 ThreadPoolExecutor 具備額外的靈活性或功能時,此類要優於 Timerapi

一旦啓用已延遲的任務就執行它,可是有關什麼時候啓用,啓用後什麼時候執行則沒有任何實時保證。按照提交的先進先出 (FIFO) 順序來啓用那些被安排在同一執行時間的任務。ide

---------------spa

平時咱們在執行一個定時任務時,會採用Time,和TimeTask來組合處理;.net

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

1:Timer只建立了一個線程。當你的任務執行的時間超過設置的延時時間將會產生一些問題。code

2:Timer建立的線程沒有處理異常,所以一旦拋出非受檢異常,該線程會當即終止。orm

JDK 5.0之後推薦使用ScheduledThreadPoolExecutor。該類屬於Executor Framework,它除了能處理異常外,還能夠建立多個線程解決上面的問題htm

 

 

複製代碼
 1 package timer;
 2 
 3 import java.text.SimpleDateFormat;
 4 import java.util.Date;
 5 import java.util.concurrent.ScheduledThreadPoolExecutor;
 6 import java.util.concurrent.TimeUnit;
 7 
 8 public class Test
 9 {
10     static ScheduledThreadPoolExecutor stp = null;
11     static int index;
12     
13     private static String getTimes() {  
14         SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss E");  
15         Date date = new Date();  
16         date.setTime(System.currentTimeMillis());  
17         return format.format(date);  
18     } 
19     
20     
21     private static class MyTask implements Runnable {  
22         
23         @Override  
24         public void run() {  
25             index++;  
26             System.out.println("2= " + getTimes()+" "  +index);  
27 //            if(index >=10){  
28 //                stp.shutdown();  
29 //                if(stp.isShutdown()){  
30 //                    System.out.println("中止了????");
31 //                } 
32 //            }
33         }
34     }
35     public static void main(String[] args)
36     {
37         stp = new ScheduledThreadPoolExecutor(5);
38         MyTask mytask = new MyTask();
39         //mytask爲線程,2是首次執行的延遲時間,最後一個參數爲時間單位
40 //        stp.schedule(mytask, 2, TimeUnit.SECONDS);
41         // 首次執行延遲2秒,以後的執行週期是1秒
42 //        stp.scheduleAtFixedRate(mytask, 2, 1,TimeUnit.SECONDS );
43         //首次執行延遲2秒,以後從上一次任務結束到下一次任務開始時1秒
44         stp.scheduleWithFixedDelay(mytask, 2, 1, TimeUnit.SECONDS);
45         
46     }
47 
48 }
複製代碼
相關文章
相關標籤/搜索