我有一段持续5分钟的Java代码 并计划每60秒运行一次任务。
问题:如何更改代码以使其永久运行并每1分钟执行一次任务:
代码:
public class MyTimerTask extends TimerTask{
@Override
public void run() {
System.out.println("Timer task started at:" + new Date());
completeTask();
System.out.println("Timer task finished at:" + new Date());
}
private void completeTask() {
//Task to be exeucted
}
public static void main(String args[]) {
TimerTask timerTask = new MyTimerTask();
// running timer task as daemon thread
Timer timer = new Timer(true);
// schedule the task to run every 1 minute
timer.scheduleAtFixedRate(timerTask, 0, 60 * 1000);
System.out.println("TimerTask started");
// cancel after sometime
try {
Thread.sleep(300*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//timer.cancel();
System.out.println("TimerTask cancelled");
try {
Thread.sleep(30000);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
请告知
答案 0 :(得分:0)
答案很简单,因为您将其作为守护程序运行,主线程将休眠五分钟,之后在您的应用程序上没有运行其他“本地”线程,因此应用程序终止。
如果你没有充分的理由将Timer作为守护进程运行,那你就不应该这样做。
取自Timer类的documentation“如果定时器将用于安排重复的”维护活动“,则必须执行守护程序线程,只要应用程序正在运行,就必须执行该操作,但不应延长应用程序的生命周期。“。
处理此问题的最简单方法是使用不带布尔值的构造函数(即
)定时器计时器=新的计时器();
)。这将使它“永远”运行。
但是,如果由于某种原因,您必须将其作为守护程序运行,则只需插入一个永久运行的while循环:
while(!false){}
这应该放在主方法的末尾。
你应该记住,这也会阻止应用程序停止,因为只要true不等于false(即永远),这段代码就会阻塞主线程。