关于java中定时器的实现 三种方式

最近需要写个小程序,实现定时将记事本中的数据导入到数据库,这个小程序大致可以分为三个模块,读取文件内容,解析文件内容(封装成对象集合),插入数据库(自己写的一个工具类,传入数据对象集合、表名即可)。

对定时任务这块,因为只是个小程序,不想引用第三方的定时任务 quartz, 找了下其他的实现,总结了下。 java中实现定时任务至少有三种方式。

1.自己写while(true)死循环,来判断是否到达执行时间条件

这种实现定时任务的方式,完全是自己写代码实现,放在第一个介绍,是因为它最灵活,完全由自己控制,但是缺点是,只适合小工具类的程序,任务单一固定的程序。
实现的简单代码块如下:


long  interval = 100;   // 秒
String runTime = "12:50";
 Date startTime = new Date();
 boolean runFlag = false;
 int count = 0;
while(true){
	     Date nowTime = new Date();
if (!StringUtils.isEmpty(runTime)) {
    String checkTime = DateUtilsExt.getNowTime("HH:mm");
    if (runTime.equals(checkTime)) {
        runFlag = true;
    }
} else if (intervalTime > 0) {
    long now = nowTime.getTime();
    long start = startTime.getTime();
    long interval = (now - start)/1000;
    //第一次执行
    if (count == 0) {
        runFlag = true;
    //间隔时间执行  运行间隔到了指定秒以后执行
    } else if (intervalTime <= interval){
        runFlag = true;
    }
}
if (runFlag) {
// 执行定时任务
}
 
}

2.java自带的工具类 timer + timerTask

这个方式是我们本次导数工具所用的程序。用着挺方便,timer ,timerTask 都是java.util中提供的工具类, 既可以用于java web项目,也可以用于javase项目。实,现代码如下
1.具体任务类
public class DateImportTask extends TimerTask {

    private static Logger log = Logger.getLogger(DateImportTask.class);
    private static boolean isRunning = false;
    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
    public void run() {
        if (!isRunning) {
            isRunning = true;
            log.info("开始执行任务..."); //开始任务

            //working  add what you want to do

            log.info("执行任务完成..."); //任务完成
            isRunning = false;
        } else {
            log.info("上一次任务执行还未结束..."); //上一次任务执行还未结束

        }
    }
}
2.任务控制类

public class TaskManager implements ServletContextListener {

    private final Logger logger = Logger.getLogger(TaskManager.class);

    /**
     * 无延迟
     */
    public static final long NO_DELAY = 0;
    /**
     * 定时器
     */
    private Timer timer;
    /**
     * Web应用启动时初始化任务
     */
    public void contextInitialized(ServletContextEvent event) {
        //定义定时器
        timer = new Timer("数据导入任务",true);

        logger.info("定时器初始化。。。");
        //启动备份任务,每  执行一次
//        timer.schedule(new DateImportTask(),NO_DELAY, DateUtils.MILLIS_PER_SECOND * 1);

        // 设置指定时间点启动任务
        String startHour =  event.getServletContext().getInitParameter("startHour");
        String startMinute =  event.getServletContext().getInitParameter("startMinute");
        int hour = 14;
        if (StringUtils.isNotBlank(startHour)){
            hour = Integer.parseInt(startHour);
        }
        int minute = 14;
        if (StringUtils.isNotBlank(startMinute)){
            minute = Integer.parseInt(startMinute);
        }
        Calendar c = Calendar.getInstance();
        c.set(Calendar.HOUR_OF_DAY,hour);
        c.set(Calendar.MINUTE,minute);

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        logger.info("设置的启动时间为:"+sdf.format(c.getTime()));
        timer.schedule(new DateImportTask(), c.getTime() , DateUtils.MILLIS_PER_DAY * 1);

    }
    /**
     * Web应用结束时停止任务
     */
    public void contextDestroyed(ServletContextEvent event) {

        logger.info("定时器销毁。。。");
        timer.cancel(); // 定时器销毁
    }
}



3.quartz

      Quartz是OpenSymphony开源组织的开源项目,既可以用于java web项目,也可以用于javase项目
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值