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

timer定时任务
timer可以在固定时间进行一个task,如果想固定在周三的14:00,如何去进行判断比较合理?

------解决方案--------------------
用quartz吧
------解决方案--------------------
比较笨的方法是:每一个小时执行一次,然后判断时间是否合你的要求

用框架比较好
------解决方案--------------------
Java code

Timer timer  = new Timer();
        
        Calendar cal = Calendar.getInstance();
        
        switch (cal.get(Calendar.DAY_OF_WEEK)) {
        case Calendar.SUNDAY:
            cal.add(Calendar.DAY_OF_MONTH, 3);break;
        case Calendar.MONDAY:
            cal.add(Calendar.DAY_OF_MONTH, 2);break;
        case Calendar.TUESDAY:
            cal.add(Calendar.DAY_OF_MONTH, 1);break;
        case Calendar.THURSDAY:
            cal.add(Calendar.DAY_OF_MONTH, 6);break;
        case Calendar.FRIDAY:
            cal.add(Calendar.DAY_OF_MONTH, 5);break;
        case Calendar.SATURDAY:
            cal.add(Calendar.DAY_OF_MONTH, 4);break;
        default:
            break;
        }
        
        String dateStr = new SimpleDateFormat("yyyy-MM-dd").format(cal.getTime());
        
        timer.schedule(new TimerTask() {
            public void run() {
                //do someThing
            }
        }, new SimpleDateFormat("yyyy-MM-dd HH:mm").parse(dateStr+" 14:00"), 1000*60*60*24*7);

------解决方案--------------------
Timer有两种执行任务的模式,最常用的是schedule,它可以以两种方式执行任务:1:在某个时间(Data),2:在某个固定的时间之后(int delay).
------解决方案--------------------
Java code

import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class TimerManager {

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

    public TimerManager() {
        Calendar calendar = Calendar.getInstance();

        /*** 定制周三的14:00执行方法 ***/
        System.out.println(calendar.get(Calendar.DATE));
        System.out.println(calendar.get(Calendar.DAY_OF_WEEK));
        int nextDateDistance = Calendar.WEDNESDAY - calendar.get(Calendar.DAY_OF_WEEK); 
                

        calendar.set(Calendar.DATE,calendar.get(Calendar.DATE) + nextDateDistance);//设置星期三
        calendar.set(Calendar.HOUR_OF_DAY, 14);//设置时间
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);

        Date date = calendar.getTime(); // 第一次执行定时任务的时间

        if (date.before(new Date())) {
            date = this.addDay(date, 7);//如果上次日期过期了,+7天变成有效日期
        }

        Timer timer = new Timer();

        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                System.out.println("your personal logic");
            }
        };
        // 安排指定的任务在指定的时间开始进行重复的固定延迟执行。
        timer.schedule(task, date, PERIOD_DAY);
    }

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

    public static void main(String args[]) {
        new TimerManager();
    }
}

------解决方案--------------------
任务调度的东西非常复杂,不建立使用 Timer 去做,直接使用 Quartz 吧。

就是一个每周三 14 点执行这么简单的功能,自行实现的话需要有很深厚的多线程开发经验!