日期:2014-05-20  浏览次数:21041 次

java定时程序的实现,不用Spring
java定时程序的实现,不用Spring

------解决方案--------------------
Timer,线程都可以
for exampe

Java code
import java.util.*;
class Test {
    public static void main(String[] args) {
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTask() {
            public void run() {
                Calendar c = Calendar.getInstance();
                System.out.printf("%tF %tT\n", c.getTime(), c.getTime());
            }
        }, 0, 1000);
    }
}

------解决方案--------------------
给你看个Timer的例子,tomcat启动就开始定时

Java code
package com.pro_crm.tools;

import java.util.Timer;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class ContextLister implements ServletContextListener {

    private Timer timer = null;

    // 定时器开始
    public void contextInitialized(ServletContextEvent event) {
        // 设置时间 星期日 5:30 10s
        // Date start = new Date();
        // start.setHours(2);
        // start.setMinutes(30);
        // start.setSeconds(10);
        // start.toLocaleString();
        timer = new Timer(true);
        event.getServletContext().log("定时器开始启动");
        /*
         * @parmer: TimeLister是自定义需要被调度的执行任务(要被定时执行的任务),继承java.util.TimerTask
         * 
         * @parmer: 中间参数0表示无延迟 @parmer: 第三个参数表示每分钟(即601000毫秒)被触发一次
         */
        timer.schedule(new TimeLister(event.getServletContext()), 0, 1000 * 60
                * 60 * 24 * 7);
        event.getServletContext().log("已经将定时任务添加到任务调度表中");
    }

    // 定时器销毁
    public void contextDestroyed(ServletContextEvent event) {
        timer.cancel();
        event.getServletContext().log("定时器销毁");
    }

    // 定时调度器
    // (1)Timer.schedule(TimerTask task,Date time)安排在制定的时间执行指定的任务。
    // (2)Timer.schedule(TimerTask task,Date firstTime ,long
    // period)安排指定的任务在指定的时间开始进行重复的固定延迟执行.
    // (3)Timer.schedule(TimerTask task,long delay)安排在指定延迟后执行指定的任务.
    // (4)Timer.schedule(TimerTask task,long delay,long
    // period)安排指定的任务从指定的延迟后开始进行重复的固定延迟执行.
    // (5)Timer.scheduleAtFixedRate(TimerTask task,Date firstTime,long
    // period)安排指定的任务在指定的时间开始进行重复的固定速率执行.
    // (6)Timer.scheduleAtFixedRate(TimerTask task,long delay,long
    // period)安排指定的任务在指定的延迟后开始进行重复的固定速率执行.
}

------解决方案--------------------
Java code
package com.pro_crm.tools;

import java.util.Calendar;
import java.util.TimerTask;

import javax.servlet.ServletContext;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

import com.pro_crm.client.dao.ClienDao;
import com.pro_crm.client.dao.LostDao;
import com.pro_crm.client.dao.OrderDao;

public class TimeLister extends TimerTask {

    // 时钟点,想实现调度任务每24小时(晚上12点,也即0点)被执行一次,任务开始时间
    private static final int C_SCHEDULE_HOUR = 2;
    // 是否正在执行(标志) 防止24小时执行下来,任务还未执行完,避免第二次又被调度以引起执行冲突
    private static boolean isRuning = false;
    // 记录Servlet日志
    private ServletContext context = null;

    public TimeLister(ServletContext context) {
        this.context = context;
    }

    public void run() {
        Calendar time = Calendar.getInstance();
        if (!isRuning) {
            if (C_SCHEDULE_HOUR == time.get(Calendar.HOUR_OF_DAY)) {
                isRuning = true;
                // 获取当前系统路径
                String path = context.getRealPath("/");
                try {
                    // 加载Spring
                    ApplicationContext applicationContext = new FileSystemXmlApplicationContext(
                            path + "/WEB-INF/applicationContext.xml");
                    // 得到接口
                    LostDao dao = (LostDao) applicationContext
                            .getBean("lostDao");
                    OrderDao orderservice = (OrderDao) applicationContext
                            .getBean("orderDao");
                    ClienDao clientdao = (ClienDao) applicationContext
                            .getBean("clienDao");
                    // 调用实现方法
                    dao.allLostInfo(orderservice, clientdao);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                isRuning = false;
                context.log("指定任务执行结束");
            }
        }
    }
}