zoukankan      html  css  js  c++  java
  • java之 Timer 类的简单使用案例

              (如果您看到本文章务必看结尾!)

    第一次用Timer类,记录一下个人理解。

    场景:做苹果内容结果验证时,根据苹果支付凭证去苹果官方服务器验证是否支付成功。但因为苹果服务器比较慢,第一次验证的结果也许不是实时结果,需要多次验证。

    所以就使用到了Timer类,定时限制次数去验证支付结果。

    我设计的是每秒验证一次,共验证十次。

    其实就Timer来讲就是一个调度器,而TimerTask呢只是一个实现了run方法的一个类,而具体的TimerTask需要由你自己来实现,例如这样:

    Timer timer = new Timer();
    timer.schedule(new TimerTask() {
            public void run() {
                System.out.println("每秒执行一次");
            }
    }, 500 , 1000);

    方法摘要:

    void cancel()    终止此计时器,丢弃所有当前已安排的任务。

    int purge()     从此计时器的任务队列中移除所有已取消的任务。

    void schedule(TimerTask task, Date time)     安排在指定的时间执行指定的任务。

    void schedule(TimerTask task, Date firstTime, long period)     安排指定的任务在指定的时间开始进行重复的固定延迟执行

    void schedule(TimerTask task, long delay)     安排在指定延迟后执行指定的任务。

    void schedule(TimerTask task, long delay, long period)     安排指定的任务从指定的延迟后开始进行重复的固定延迟执行

    void scheduleAtFixedRate(TimerTask task, Date firstTime, long period)     安排指定的任务在指定的时间开始进行重复的固定速率执行

    void scheduleAtFixedRate(TimerTask task, 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,据说它也改善了这两大缺陷

  • 相关阅读:
    getopt 命令行参数解析
    Linux下使用indent整理代码
    终端常用快捷键
    gedit 乱码解决
    linux sysrq
    linux下的文件审计功能(audit inotify)
    gdb基本命令
    linux shell 字符截断
    linux 设置时间 date命令
    Ubuntu 时间同步
  • 原文地址:https://www.cnblogs.com/hero123/p/9166551.html
Copyright © 2011-2022 走看看