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编辑  收藏  举报

导航