【发布时间】:2018-05-23 06:30:53
【问题描述】:
有什么好办法,就用类库来实现...
我想要一个 java 程序有一个时间列表 [8.47am, 8.49am, 9pm..] 并且当每个时间到达时,运行一些代码(启动单独的 JAR)。我可以试一试,但想要一些指导,例如用于计时器的最佳课程。也许有些是阻塞/非阻塞的。
谢谢。
【问题讨论】:
标签: java multithreading timer
有什么好办法,就用类库来实现...
我想要一个 java 程序有一个时间列表 [8.47am, 8.49am, 9pm..] 并且当每个时间到达时,运行一些代码(启动单独的 JAR)。我可以试一试,但想要一些指导,例如用于计时器的最佳课程。也许有些是阻塞/非阻塞的。
谢谢。
【问题讨论】:
标签: java multithreading timer
我们可以通过使用内部实现可运行接口的 TimerTask 类来做到这一点。 声明一个arrayList并将所需的时间插入其中,方法调用将相应地安排。
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
//The task which you want to execute
class MyTimeTask extends TimerTask
{
public void run()
{
System.out.println("DO some task");
}
public static void main(String[] args) throws ParseException {
//the Date and time at which you want to execute
DateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm a");
Date date = dateFormatter.parse("2018-05-23 12:43 am");
Date date1 = dateFormatter.parse("2018-05-23 12:43 pm");
ArrayList<Date> d=new ArrayList<>();
d.add(date);
d.add(date1);
//Now create the time and schedule it
Timer timer = new Timer();
//Use this if you want to execute it once
for(Date dd:d){
timer.schedule(new MyTimeTask(),dd);
}
//Use this if you want to execute it repeatedly
//int period = 10000;//10secs
//timer.schedule(new MyTimeTask(), date, period );
}
}
【讨论】:
如果你想要持久的计时器,并且有可能触发错过的计时器,你应该考虑 Quartz 库: http://www.quartz-scheduler.org
否则,您的操作系统已经支持您想要执行的操作。在 Windows 中,您可以使用任务计划程序。在 linux 和 Mac 中,您可以使用 CRON。
cron 示例:
# Run at exactly 8:47 am
47 8 * * * java -jar first_app.jar
# Run at exactly 9 pm
0 21 * * * java -jar second_app.jar
# Run every 15 minutes
*/15 * * * * java -jar third_app.jar
【讨论】: