Java定时器
java.util.Timer是一个工具类,该类用来调度一个线程,使它可以在将来某一时刻执行。
java.util.TimerTask是一个抽象类,它实现了Runnable接口。我们需要扩展该类以便创建自己的TimerTask,这个TimerTask内部使用java Timer类,可以被调度。
Timer类是线程安全的,多进程不需要外部同步机制就可以共享同一个Timer对象。
Timer类使用java.util.TaskQueue在指定时间间隔添加任务,在任何时刻只能有一个线程执行TimerTask。
Timer类使用对象的wait和notify方法来调度任务。例如,创建一个每10秒运行的Timer,但单个线程的执行时间花费20秒,Timer对象将持续将任务添加到队列,一旦有任务结束,它就会通知队列,并且另外一个线程将启动执行。
public void scheduleAtFixedRate(TimerTask task,long delay,long period)安排指定的任务在指定的延迟后开始进行重复的固定速率执行。以近似固定的时间间隔(由指定的周期分隔)进行后续执行。 task
- 所要安排的任务。delay
- 执行任务前的延迟时间,单位是毫秒。period
- 执行各后续任务之间的时间间隔,单位是毫秒。
public void cancel()终止此计时器,丢弃所有当前已安排的任务。这不会干扰当前正在执行的任务(如果存在)。一旦终止了计时器,那么它的执行线程也会终止,并且无法根据它安排更多的任务。 注意,在此计时器调用的计时器任务的 run 方法内调用此方法,就可以绝对确保正在执行的任务是此计时器所执行的最后一个任务。
网上有很多例子,此处是借用 https://www.cnblogs.com/Sunnor/p/6813098.html,感谢原作者,如果懒得度娘,可以参考一下:
第一步,把自己写的监听器加到web.xml中;
第二步,写一个监听器,实现ServletContextListener接口;
第三步,写一个定时器,继承TimerTask,在复写的run()方法里写具体的业务逻辑。
第四步,在自己的监听器里复写的。
<!-- 用于补偿认证信息异常的数据,用来启动定时器,20170505 --> 2 <listener> 3 <listener-class>com.dcits.app.servlet.MyTimerTaskListener</listener-class> 4 </listener>
package com.dcits.app.servlet; import java.util.Calendar; import java.util.Timer; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; public class MyTimerTaskListener implements ServletContextListener { private Timer timer = null; @Override public void contextDestroyed(ServletContextEvent arg0) { timer.cancel(); } @Override public void contextInitialized(ServletContextEvent arg0) { System.out.println("-----开始启动定时器------"); Calendar twentyOne = Calendar.getInstance(); twentyOne.set(Calendar.HOUR_OF_DAY, 23); twentyOne.set(Calendar.MINUTE, 0); twentyOne.set(Calendar.SECOND, 0); timer = new Timer(true); //第一次是晚上23点执行,间隔24小时执行一次 timer.schedule(new MyTimerTask(), twentyOne.getTime(), 1000*60*60*24); /*System.out.println("-----开始启动定时器------"); Calendar twentyOne = Calendar.getInstance(); twentyOne.set(Calendar.HOUR_OF_DAY, 14); twentyOne.set(Calendar.MINUTE, 47); twentyOne.set(Calendar.SECOND, 0); timer = new Timer(true); timer.schedule(new MyTimerTask(), twentyOne.getTime(), 1000*10);*/ } }
package com.dcits.app.servlet; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.TimerTask; import org.codehaus.jackson.JsonGenerationException; import org.codehaus.jackson.map.JsonMappingException; /** * 定时器,用于补偿认证的时候没有获取到正常返回的那些数据 */ public class MyTimerTask extends TimerTask{ private static StringBuffer url = new StringBuffer(); @Override public void run() { //生产环境 // url.append("https://我是具体的ip地址/nmsypt/servlet/webServlet");//生产环境 url.append("http://localhost:8080/adp/servlet/webServlet");//本地环境 Map<String,Object> reqMap = new HashMap<String,Object>(); //这里的map从数据库里获取对应的数据不写死就行了,先获取map,在写个for循环进行循环就行了 reqMap.put("QYMC","丹同学的公司"); reqMap.put("NSRSBH","158028307441234"); reqMap.put("SJHM_FR","15802830744"); reqMap.put("YZM","123456"); reqMap.put("CWFZR","");// reqMap.put("ZJLX_DM_CW","");// reqMap.put("ZJHM_CW","");// reqMap.put("ZGRS","1234"); reqMap.put("SQYY","");// reqMap.put("JRCPBM","00002"); reqMap.put("XYDM","1"); reqMap.put("XZQHDM",""); reqMap.put("QYBM","QY17900000647001"); try { CompensateData.CompensateDatas(url.toString(), reqMap); System.out.println("-----成功补偿了一条认证信息------"); } catch (JsonGenerationException e) { e.printStackTrace(); } catch (JsonMappingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
推荐一下这篇文章 https://www.w3cschool.cn/java/java-timer.html
posted on 2019-03-21 20:20 湖人总冠军forever 阅读(164) 评论(0) 编辑 收藏 举报