zoukankan      html  css  js  c++  java
  • 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项目

  • 相关阅读:
    Linux 下判断磁盘是ssd还是hdd
    Ceph rgw COR测试
    nfs 挂载选项
    【Linux命令】dmsetup--device mapper 管理工具(更底层的管理工具)
    Device Mapper 存储介绍
    easyui combotree 默认 初始化时就选中
    EasyUI 添加tab页(iframe方式)(转)
    EasyUI DataGrid 配置参数
    EasyUI 后台接受DataGrid传来的参数
    (转)combogrid的代码实例
  • 原文地址:https://www.cnblogs.com/unique1/p/13280990.html
Copyright © 2011-2022 走看看