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

第一次用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类:

 package com.xxxx.controller;

 import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap; import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager; import com.alibaba.fastjson.JSONObject;
import com.wfcm.utils.R; public class Test { private static ConcurrentMap<String, Integer> map = new ConcurrentHashMap<>(); private static final String certificateUrlTest = "https://sandbox.itunes.apple.com/verifyReceipt"; public static void main(String[] args) { System.out.println(tim().toString()); } private static R tim () {
final Timer timer = new Timer();
final String certificateCode1 = "234234234234";
timer.schedule(new TimerTask() { @Override
public void run() {
if (map.get(certificateCode1) != null) {
map.put(certificateCode1, map.get(certificateCode1) + 1);
} else {
map.put(certificateCode1, 1);
}
if (map.get(certificateCode1) >= 20) {
map.remove(certificateCode1);
timer.cancel();
}
String r1 = sendHttpsCoon(certificateUrlTest, certificateCode1);
if (JSONObject.parseObject(r1).getString("status").equals("0")) {
map.remove(certificateCode1);
timer.cancel();
}
System.out.println("设定指定任务task在指定延迟delay后执行");
}
},500 , 1000);
System.out.println("******************方法结束");
return R.error("68");
} private static String sendHttpsCoon(String url, String code){
if(url.isEmpty()){
return null;
}
try {
//设置SSLContext
SSLContext ssl = SSLContext.getInstance("SSL");
ssl.init(null, new TrustManager[]{myX509TrustManager}, null); //打开连接
HttpsURLConnection conn = (HttpsURLConnection) new URL(url).openConnection();
//设置套接工厂
conn.setSSLSocketFactory(ssl.getSocketFactory());
//加入数据
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setRequestProperty("Content-type","application/json"); JSONObject obj = new JSONObject();
obj.put("receipt-data", code); BufferedOutputStream buffOutStr = new BufferedOutputStream(conn.getOutputStream());
buffOutStr.write(obj.toString().getBytes());
buffOutStr.flush();
buffOutStr.close(); //获取输入流
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line = null;
StringBuffer sb = new StringBuffer();
while((line = reader.readLine())!= null){
sb.append(line);
}
return sb.toString(); } catch (Exception e) {
return null;
}
} private static TrustManager myX509TrustManager = new X509TrustManager() { @Override
public X509Certificate[] getAcceptedIssuers() {
return null;
} @Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } @Override
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { }
};
}

第二次修订:

在后续的学习中发现了一个更好的方法,同时也发现了Timer的不足之处。更多请看下面文章,写的很好:

Timer的缺陷分析

.综上所述,推荐使用ScheduleExecutorService ,在以后的开发中尽可能使用ScheduledExecutorService(JDK1.5以后)替代Timer。

或者使用Quartz,据说它也改善了这两大缺陷

java之 Timer 类的简单使用案例的更多相关文章

  1. java中Color类的简单总结

    java中Color类的简单总结 1.颜色的常识 任何颜色都是由三原色组成(RGB),JAVA中支持224为彩色,即红绿蓝分量取值 介于0-255之间(8位表示) 2.Color类中的常量 publi ...

  2. 两种流行Spring定时器配置:Java的Timer类和OpenSymphony的Quartz

    1.Java Timer定时 首先继承java.util.TimerTask类实现run方法 import java.util.TimerTask; public class EmailReportT ...

  3. java中Timer类的详细介绍(详解)

    一.概念 定时计划任务功能在Java中主要使用的就是Timer对象,它在内部使用多线程的方式进行处理,所以它和多线程技术还是有非常大的关联的.在JDK中Timer类主要负责计划任务的功能,也就是在指定 ...

  4. Java单例类的简单实现

    对于java新手来说,单例类给我的印象挺深,之前一道web后台笔试题就是写单例类.*.*可惜当时不了解. 在大部分时候,我们将类的构造器定义成public访问权限,允许任何类自由创建该类的对象.但在某 ...

  5. java之 Timer 类的使用以及深入理解

    最近一直在看线程知识,然后看到Timer定时器使用了线程实现的定时功能,于是了解了解: 本文 从Time类的使用和源码分析两个方面讲解: 1---Timer类使用 2---源码分析 1.Time类使用 ...

  6. [转载]使用java.lang.Process类的简单例子

    FROM: http://segmentfault.com/blog/lidonghao/1190000000372192 ProcessBuilder类是J2SE 1.5在java.lang中新添加 ...

  7. Java正则表达式java.util.regex类的简单使用

    1.什么是正则表达式? 正则表达式(regular expression)是根据字符串集合内每个字符串共享的共同特性来描述字符串集合的一种途径.正则表达式可以用于搜索.编辑或者处理文本和数据. Jav ...

  8. Java中console类的简单用法

    Java.io.Console 只能用在标准输入.输出流未被重定向的原始控制台中使用,在 Eclipse 或者其他 IDE 的控制台是用不了的. import java.io.Console; pub ...

  9. [ImportNew]Java中的Timer类和TimerTask类

    http://www.importnew.com/9978.html java.util.Timer是一个实用工具类,该类用来调度一个线程,使它可以在将来某一时刻执行. Java的Timer类可以调度 ...

随机推荐

  1. Python基础(8)_迭代器、生成器、列表解析

    一.迭代器 1.什么是迭代 1 重复 2 下次重复一定是基于上一次的结果而来 l=[,,,] count= while count < len(l): print(l[count]) count ...

  2. hadoop linux 杂记

    切换到root        su    修改sudo sudo + 命令 --> root权限 + 命令        su root        vim /etc/sudoers      ...

  3. Kattis - convexpolygonarea 【数学】

    题意 给出一系列点,求这个多边形面积 思路 向量叉积 AC代码 #include <cstdio> #include <cstring> #include <ctype. ...

  4. iOS NSCoding 的学习 和 使用

    起初接触的轻量级 物理存储 方式 是 plist  可以存储 系统级别的 字典 数组   但是不能存储自定义的对象类 那会 用自定义对象做存储的 需求也不大 主要 是 还没建立面向对象意识,会的也少. ...

  5. Vuex的入门教程

    前言 在 Vue.js 的项目中,如果项目结构简单, 父子组件之间的数据传递可以使用  props 或者 $emit 等方式,详细点击这篇文章查看. 但是如果是大型项目,很多时候都需要在子组件之间传递 ...

  6. mysql下merge分表

    1.merge简介分表就是把N条记录的表,分成若干个分表,各个分表记录的总和仍为N. 分表的方法有很多,用merge来分表,是最简单的一种方式.merge是mysql的一种存储引擎,它把一组MyISA ...

  7. MySQL-重做日志 redo log -原理

    [redo log buffer][redo log file]-原理 目录: 1.重做日志写入过程图 2.相关知识点汇总图 3.redo_log_buffer 原理 4.redo_log_file ...

  8. Bootstrap3组件--2

    目录 1. 分页 2. 标签 3. 徽章 4. 巨幕 5. 页头 6. 缩略图 7. 警告框 8. 进度条 9. 列表组 10. 面板 11.Well 1. 分页 <!doctype html& ...

  9. 搭建本地yum源服务器

    搭建本地yum源服务器   好久没写博客了,最近比较动荡,临毕业时跳了个槽,感觉之前做的金融方向的运维不是很适合我,对各方面的限制还是太多.金融的IT对于安全似乎要求很高,云盘,U盘都不能用,还要经常 ...

  10. springboot 配置过滤器

    能配置例外 先写配置文件类 FilterConfig.java package com.ty.tyzxtj.config; import javax.servlet.Filter; import or ...