您的位置:首页 > 编程语言 > Java开发

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

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

对定时任务这块,因为只是个小程序,不想引用第三方的定时任务 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项目
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  定时任务