java之 Timer 類的簡單使用案例
(如果您看到本文章務必看結尾!)
第一次用Timer類,記錄一下個人理解。
場景:做蘋果內容結果驗證時,根據蘋果支付憑證去蘋果官方伺服器驗證是否支付成功。但因為蘋果伺服器比較慢,第一次驗證的結果也許不是實時結果,需要多次驗證。
所以就使用到了Timer類,定時限制次數去驗證支付結果。
我設計的是每秒驗證一次,共驗證十次。
其實就Timer來講就是一個排程器,而TimerTask呢只是一個實現了run方法的一個類,而具體的TimerTask需要由你自己來實現,例如這樣:
Timer timer = new Timer(); timer.schedule(new TimerTask() { public void run() { System.out.println("每秒執行一次"); } }, 500 , 1000);
方法摘要:
voidcancel() 終止此計時器,丟棄所有當前已安排的任務。
intpurge() 從此計時器的任務佇列中移除所有已取消的任務。
voidschedule(TimerTasktask,Datetime) 安排在指定的時間執行指定的任務。
voidschedule(TimerTasktask,DatefirstTime, long period) 安排指定的任務在指定的時間開始進行重複的固定延遲執行。
voidschedule(TimerTasktask, long delay) 安排在指定延遲後執行指定的任務。
voidschedule(TimerTasktask, long delay, long period) 安排指定的任務從指定的延遲後開始進行重複的固定延遲執行
voidscheduleAtFixedRate(TimerTasktask,DatefirstTime, long period) 安排指定的任務在指定的時間開始進行重複的固定速率執行。
voidscheduleAtFixedRate(TimerTasktask, long delay, long period) 安排指定的任務在指定的延遲後開始進行重複的固定速率執行。
知識點:執行緒中的變數引數用專門的變數類,如:ConcurrentMap<String, Integer> map
Test類:
1 package com.xxxx.controller; 2 3 import java.io.BufferedOutputStream; 4 import java.io.BufferedReader; 5 import java.io.InputStreamReader; 6 import java.net.URL; 7 import java.security.cert.CertificateException; 8 import java.security.cert.X509Certificate; 9 import java.util.Timer; 10 import java.util.TimerTask; 11 import java.util.concurrent.ConcurrentHashMap; 12 import java.util.concurrent.ConcurrentMap; 13 14 import javax.net.ssl.HttpsURLConnection; 15 import javax.net.ssl.SSLContext; 16 import javax.net.ssl.TrustManager; 17 import javax.net.ssl.X509TrustManager; 18 19 import com.alibaba.fastjson.JSONObject; 20 import com.wfcm.utils.R; 21 22 public class Test { 23 24 private static ConcurrentMap<String, Integer> map = new ConcurrentHashMap<>(); 25 26 private static final String certificateUrlTest = "https://sandbox.itunes.apple.com/verifyReceipt"; 27 28 public static void main(String[] args) { 29 30 System.out.println(tim().toString()); 31 32 } 33 34 private static R tim () { 35 final Timer timer = new Timer(); 36 final String certificateCode1 = "234234234234"; 37 timer.schedule(new TimerTask() { 38 39 @Override 40 public void run() { 41 if (map.get(certificateCode1) != null) { 42 map.put(certificateCode1, map.get(certificateCode1) + 1); 43 } else { 44 map.put(certificateCode1, 1); 45 } 46 if (map.get(certificateCode1) >= 20) { 47 map.remove(certificateCode1); 48 timer.cancel(); 49 } 50 String r1 = sendHttpsCoon(certificateUrlTest, certificateCode1); 51 if (JSONObject.parseObject(r1).getString("status").equals("0")) { 52 map.remove(certificateCode1); 53 timer.cancel(); 54 } 55 System.out.println("設定指定任務task在指定延遲delay後執行"); 56 } 57 },500 , 1000); 58 System.out.println("******************方法結束"); 59 return R.error("68"); 60 } 61 62 private static String sendHttpsCoon(String url, String code){ 63 if(url.isEmpty()){ 64 return null; 65 } 66 try { 67 //設定SSLContext 68 SSLContext ssl = SSLContext.getInstance("SSL"); 69 ssl.init(null, new TrustManager[]{myX509TrustManager}, null); 70 71 //開啟連線 72 HttpsURLConnection conn = (HttpsURLConnection) new URL(url).openConnection(); 73 //設定套接工廠 74 conn.setSSLSocketFactory(ssl.getSocketFactory()); 75 //加入資料 76 conn.setRequestMethod("POST"); 77 conn.setDoOutput(true); 78 conn.setRequestProperty("Content-type","application/json"); 79 80 JSONObject obj = new JSONObject(); 81 obj.put("receipt-data", code); 82 83 BufferedOutputStream buffOutStr = new BufferedOutputStream(conn.getOutputStream()); 84 buffOutStr.write(obj.toString().getBytes()); 85 buffOutStr.flush(); 86 buffOutStr.close(); 87 88 //獲取輸入流 89 BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); 90 91 String line = null; 92 StringBuffer sb = new StringBuffer(); 93 while((line = reader.readLine())!= null){ 94 sb.append(line); 95 } 96 return sb.toString(); 97 98 } catch (Exception e) { 99 return null; 100 } 101 } 102 103 private static TrustManager myX509TrustManager = new X509TrustManager() { 104 105 @Override 106 public X509Certificate[] getAcceptedIssuers() { 107 return null; 108 } 109 110 @Override 111 public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { 112 113 } 114 115 @Override 116 public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { 117 118 } 119 }; 120 } 121
第二次修訂:
在後續的學習中發現了一個更好的方法,同時也發現了Timer的不足之處。更多請看下面文章,寫的很好:
Timer的缺陷分析
.綜上所述,推薦使用ScheduleExecutorService,在以後的開發中儘可能使用ScheduledExecutorService(JDK1.5以後)替代Timer。
或者使用Quartz,據說它也改善了這兩大缺陷