Java调度API特定的时间间隔
我对Java非常陌生,我正在尝试生成一个在特定时间运行的任务。有3种类型的明细表: a) 一年中每给定天数执行一次, b) 在一个月内每给定次数执行一次(在一个特定的月内执行1到10次), c) 每月每给定一周执行一次(一个月内从1到5的一周) 从a到c的字母是附表的选择 我尝试了几种方法,但到目前为止没有任何效果。我使用了TimerTask、Calendar和TimerAPI。我最近的努力如下: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(
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和更高版本中内置的类所取代。看见