3

我试图在一周内的每个星期五随时运行某项任务。所以我决定使用ScheduledExecutorService它,但到目前为止,我已经看到了一些示例,这些示例展示了如何每隔几分钟运行一次任务。

下面是我每天早上 5 点运行的代码。我如何使用它在一周内的每个星期五随时运行任务?

public static void main(String[] args) {

    ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(5);
    Date aDate = new Date();
    Calendar with = Calendar.getInstance();
    with.setTime(aDate);

    int hour = with.get(Calendar.HOUR_OF_DAY);
    int intDelayInHour = hour < 5 ? 5 - hour : 24 - (hour - 5);

    System.out.println("Current Hour: " + hour);
    System.out.println("Comuted Delay for next 5 AM: " + intDelayInHour);

    scheduler.scheduleAtFixedRate(new Runnable() {
        public void run() {
            try {
                getDataFromDatabase();
            } catch (Exception ex) {
                ex.printStackTrace(); // or loggger would be better
            }
        }
    }, intDelayInHour, 24, TimeUnit.HOURS);
}

protected static void getDataFromDatabase() {
    // TODO Auto-generated method stub

}

谁能提供一个例子我该怎么做?

4

2 回答 2

3

你必须检查今天是什么日子。

然后将延迟设置为下一个星期五(假设是星期二,然后设置 3 天延迟,或者如果您想将其设置在不同的时间,则使用小时数)。

然后使用 7 天的时间段(或等效的小时数)。

编辑:

根据要求,您可以执行类似的操作。

Map<Integer, Integer> dayToDelay = new HashMap<Integer, Integer>()
dayToDelay.put(Calendar.FRIDAY, 0);
dayToDelay.put(Calendar.SATURDAY, 6);
dayToDelay.put(Calendar.SUNDAY, 5);
dayToDelay.put(Calendar.MONDAY, 4);
dayToDelay.put(Calendar.TUESDAY, 3);
dayToDelay.put(Calendar.WEDNESDAY, 2);
dayToDelay.put(Calendar.THURSDAY, 1);
int dayOfWeek = with.get(DAY_OF_WEEK);
int delayInDays = dayToDelay.get(dayOfWeek);

scheduler.scheduleAtFixedRate(new Runnable() {
    public void run() {
        try {
            getDataFromDatabase();
        } catch (Exception ex) {
            ex.printStackTrace(); // or loggger would be better
        }
    }
}, delayInDays, 7, TimeUnit.DAYS);

这应该在每周五执行时运行任务。

于 2014-03-01T18:13:42.770 回答
2

每周一上午 11 点运行程序

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

WeeklyReportService.java

public class WeeklyReportService{

public WeeklyReportService(){
    this.startScheduler();
}

private void startScheduler(){
    Calendar with = Calendar.getInstance();
    Map<Integer, Integer> dayToDelay = new HashMap<Integer, Integer>();
            dayToDelay.put(Calendar.FRIDAY, 2);
            dayToDelay.put(Calendar.SATURDAY, 1);
            dayToDelay.put(Calendar.SUNDAY, 0);
            dayToDelay.put(Calendar.MONDAY, 6);
            dayToDelay.put(Calendar.TUESDAY, 5);
            dayToDelay.put(Calendar.WEDNESDAY, 4);
            dayToDelay.put(Calendar.THURSDAY, 3);
            int dayOfWeek = with.get(Calendar.DAY_OF_WEEK);
            int hour = with.get(Calendar.HOUR_OF_DAY);
            int delayInDays = dayToDelay.get(dayOfWeek);
            int delayInHours = 0;
            if(delayInDays == 6 && hour<11){
                delayInHours = 11 - hour;
            }else{
                delayInHours = delayInDays*24+((24-hour)+11);
            }
     ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);            
     scheduler.scheduleAtFixedRate(new WeeklyTask(), delayInHours,
                                   179, TimeUnit.HOURS);
}

WeeklyTask.java

Public class WeeklyTask implements Runnable {


@Override
public void run() {
    System.out.println("start of weekly report");
    /*Your Program to run*/
    System.out.println("end of weekly report");
}

}

希望这可以帮助!您可以将其应用于任何一天。就您而言,周五上午 11 点将是

            dayToDelay.put(Calendar.FRIDAY, 6);
            dayToDelay.put(Calendar.SATURDAY, 5);
            dayToDelay.put(Calendar.SUNDAY, 4);
            dayToDelay.put(Calendar.MONDAY, 3);
            dayToDelay.put(Calendar.TUESDAY, 2);
            dayToDelay.put(Calendar.WEDNESDAY, 1);
            dayToDelay.put(Calendar.THURSDAY, 0);
于 2018-08-23T13:03:27.313 回答