JAVA三种方式完成定时任务

2018-08-02  本文已影响0人  莫小归

参考:https://www.jianshu.com/p/db1611a16cb8

需求:在某个时间点一定时间后,定时执行任务

思路:
1.使用JDK自带Timer;
2.JDK1.5新增的ScheduledExecutorService;
3.使用Quartz(JAVA作业调度框架);
4.Spring3.0自带task
下面介绍自己使用第一种方法完成需求的过程,后三种方法未亲测,可移步参考链接了解

1.Timer类主要方法
该类允许调度一个java.util.TimerTask任务,主要方法如下
*schedule(TimerTask task, long delay) 延迟 delay 毫秒后,执行task
*schedule(TimerTask task, Date time) 在特定时间time执行task
*schedule(TimerTask task, long delay, long period) 延迟delay后执行task,并每隔period执行一次

2.JAVA代码
继承TimerTask类的TimerNotifyUtil,定时发送提醒消息类,提醒次日有预约的用户

import java.text.SimpleDateFormat;
import java.util.*;

public class TimerNotifyUtil extends TimerTask {
    public void run() {
        //获得次日日期
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.DATE,1);
        String tomorrow = new SimpleDateFormat("yyyy-MM-dd").format(cal.getTime());

        //通过日期查询数据库预约记录
        SQLUtil sUtil = new SQLUtil();
        List<Map<String,String>> appNotify = sUtil.queryAppNotifyMap(tomorrow);
        for (Map<String,String> temp: appNotify) {
              //就每条需要发送提醒的记录调用发送提醒的方法
        }
    }
}

设置发送提醒消息的线程,定时启动TimerNotifyUtil

import com.dandelion.util.TimerNotifyUtil;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;

public class TimerNotifyThread implements Runnable {

     //时间间隔
    private static final long PERIOD_DAY = 24*60*60*1000;

     public void run() {
         log.info("进入定时发送咨询提醒功能!");
         Calendar calendar = Calendar.getInstance();
         calendar.set(Calendar.HOUR_OF_DAY,20);
         calendar.set(Calendar.MINUTE,0);
         calendar.set(Calendar.SECOND,0);
         Date date = calendar.getTime();
         //如果第一次执行定时任务的时间 小于当前的时间
         //此时要在 第一次执行定时任务的时间加一天,以便此任务在下个时间点执行。如果不加一天,任务会立即执行。
         if (date.before(new Date())){
             date = this.addDay(date,1);
         }
        //使用Timer类schedule方法定时循环执行
         Timer timer = new Timer();timerNotifyUtil任务
         TimerNotifyUtil timerNotifyUtil = new TimerNotifyUtil();
         timer.schedule(timerNotifyUtil,date,PERIOD_DAY);
     }

    // 增加或减少天数
    private Date addDay(Date date, int num) {
        Calendar startDT = Calendar.getInstance();
        startDT.setTime(date);
        startDT.add(Calendar.DAY_OF_MONTH, num);
        return startDT.getTime();
    }

日暮汉宫传蜡烛,轻烟散入五侯家

上一篇下一篇

猜你喜欢

热点阅读