Java调度API特定的时间间隔

Java调度API特定的时间间隔,java,scheduled-tasks,Java,Scheduled Tasks,我对Java非常陌生,我正在尝试生成一个在特定时间运行的任务。有3种类型的明细表: a) 一年中每给定天数执行一次, b) 在一个月内每给定次数执行一次(在一个特定的月内执行1到10次), c) 每月每给定一周执行一次(一个月内从1到5的一周) 从a到c的字母是附表的选择 我尝试了几种方法,但到目前为止没有任何效果。我使用了TimerTask、Calendar和TimerAPI。我最近的努力如下: public class Runner { public static void runTask(

我对Java非常陌生,我正在尝试生成一个在特定时间运行的任务。有3种类型的明细表: a) 一年中每给定天数执行一次, b) 在一个月内每给定次数执行一次(在一个特定的月内执行1到10次), c) 每月每给定一周执行一次(一个月内从1到5的一周)

从a到c的字母是附表的选择

我尝试了几种方法,但到目前为止没有任何效果。我使用了TimerTask、Calendar和TimerAPI。我最近的努力如下:

public class Runner {
public static void runTask(int year, int month, int day, int hour, int minute, int second, String choice) {

    Calendar startTime = Calendar.getInstance();
    startTime.set(Calendar.YEAR, year );
    startTime.set(Calendar.MONTH,month);
    startTime.set(Calendar.DAY_OF_MONTH,day);
    startTime.set(Calendar.HOUR_OF_DAY, hour);
    startTime.set(Calendar.MINUTE, minute);
    startTime.set(Calendar.SECOND, second);
    startTime.set(Calendar.MILLISECOND, 0);

    Calendar bStartTime = Calendar.getInstance();
    bStartTime.set(Calendar.YEAR,year);
    bStartTime.set(Calendar.MONTH,month-1);
    bStartTime.set(Calendar.DAY_OF_MONTH,1);
    bStartTime.set(Calendar.HOUR_OF_DAY,12);
    bStartTime.set(Calendar.MINUTE, 0);
    bStartTime.set(Calendar.SECOND, 0);
    bStartTime.set(Calendar.MILLISECOND, 0);
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy MMM dd");
    long timeToEnd = 0;

    if (choice.equals("a")) {
        Timer time = new Timer();

        time.schedule(new SpecificTask(), startTime.getTime(), TimeUnit.DAYS.toMillis(1));

    }
    else if(choice.equals("b")){
        System.out.println("How many times the task should be done in "+year+"."+month);
        int counter = 0;
        Scanner sc = new Scanner(System.in);
        counter = sc.nextInt();

        Timer time = new Timer();
        time.schedule(new SpecificTask(), bStartTime.getTime(), TimeUnit.DAYS.toMillis(30/counter));
        System.out.println("Date of start : " + sdf.format(bStartTime.getTime()));

    }
    else if(choice.equals("c")){
        Timer time = new Timer();
        time.schedule(new SpecificTask(), startTime.getTime(), TimeUnit.SECONDS.toMillis(2));
    }
    else{
        System.out.println("An error has been occured");

    }

}
public static void main(String[] args) {
    int year,month,day,hour,minute,second;
    String choiceOfSchedule;
    System.out.println("Welcome in The Ultimate Task Scheduler");
    System.out.print("Select a type of schedule: ");
    Scanner sc = new Scanner(System.in);
    choiceOfSchedule = sc.nextLine();
    System.out.println("Now set the task's starting time: ... ");
    System.out.println(" Set year: ");
    year = sc.nextInt();
    System.out.print(" Set month: ");
    month =sc.nextInt();
    System.out.print(" Set day: ");
    day = sc.nextInt();
    System.out.print(" Set hour: ");
    hour = sc.nextInt();
    System.out.print( " Set minutes: ");
    minute = sc.nextInt();
    System.out.print(" Set seconds: ");
    second = sc.nextInt();
    runTask(year,month,day,hour,minute,second,choiceOfSchedule);
每个场景编写一个调度类 对于我来说,编写一种方法来处理这种不同的场景似乎毫无意义。我会为每个场景编写一个类。在设置调度时,每种任务都知道要使用哪个调度程序类

public class DaysPerYearScheduler { … }

public class TimesPerMonthScheduler { … }

public class OrdinalWeekPerMonthScheduler { … }
作为一个类比,您正在尝试使用与单个方法等效的方法来执行加减法、乘法和除法以及平均法。这不是很尴尬吗

学习使用Executor框架取代
Timer
类。这已经在堆栈溢出上讨论过很多次了


切勿使用
日历
。这个糟糕的类在几年前被java.time类所取代。避免在
java.time.*
包之外使用任何日期时间类。

一种方法是保留一些任务的结构,并使用一些东西来检查是否需要触发事件。然后执行您需要的任何逻辑。我不确定你问的是什么,我只需要一个好的代码,它可以让我在指定的时间间隔内启动指定数量的任务。例如,我们有一个像今天这样的日期,在4月份,我想设置8个任务,随着时间的推移逐渐分配。您是否编写了代码来确定任务应该在什么时候执行?一旦你明白了这一点,剩下的就不会太糟糕了。你可以使用像quartz这样的东西,也可以自己制作服务。不,我没有,这是我的问题。仅供参考,像、
java.text.SimpleDataFormat等非常麻烦的旧日期时间类现在被java 8和更高版本中内置的类所取代。看见