java怎么让程序每天晚上12点做定时任务,因为程序是不定时开的,所以要实时监听系统时间。

java怎么让程序每天晚上12点做定时任务,因为程序是不定时开的,所以要实时监听系统时间。,第1张

java定时任务,每天定时执行任务(JDK TimerTask)

标签: taskTasktimerTimer

2013-01-14 13:28 8747人阅读 评论(0) 收藏 举报

01public class TimerManager {

02

03 //时间间隔

04 private static final long PERIOD_DAY = 24 * 60 * 60 * 1000

05

06 public TimerManager() {

07 Calendar calendar = Calendar.getInstance()

08

09 /*** 定制每日2:00执行方法 ***/

10

11 calendar.set(Calendar.HOUR_OF_DAY, 2)

12 calendar.set(Calendar.MINUTE, 0)

13 calendar.set(Calendar.SECOND, 0)

14

15 Date date=calendar.getTime()//第一次执行定时任务的时间

16

17 //如果第一次执行定时任务的时间 小于 当前的时间

18 //此时要在 第一次执行定时任务的时间 加一天,以便此任务在下个时间点执行。如果不加一天,任务会立即执行。

19 if (date.before(new Date())) {

20 date = this.addDay(date, 1)

21 }

22

23 Timer timer = new Timer()

24

25 NFDFlightDataTimerTask task = new NFDFlightDataTimerTask()

26 //安排指定的任务在指定的时间开始进行重复的固定延迟执行。

27 timer.schedule(task,date,PERIOD_DAY)

28 }

29

30 // 增加或减少天数

31 public Date addDay(Date date, int num) {

32 Calendar startDT = Calendar.getInstance()

33 startDT.setTime(date)

34 startDT.add(Calendar.DAY_OF_MONTH, num)

35 return startDT.getTime()

36 }

37

38}

在 TimerManager 这个类里面,大家一定要注意 时间点的问题。如果你设定在凌晨2点执行任务。但你是在2点以后

发布的程序或是重启过服务,那这样的情况下,任务会立即执行,而不是等到第二天的凌晨2点执行。为了,避免这种情况

发生,只能判断一下,如果发布或重启服务的时间晚于定时执行任务的时间,就在此基础上加一天。

01public class NFDFlightDataTimerTask extends TimerTask {

02

03 private static Logger log = Logger.getLogger(NFDFlightDataTimerTask.class)

04

05 @Override

06 public void run() {

07 try {

08 //在这里写你要执行的内容

09

10 } catch (Exception e) {

11 log.info("-------------解析信息发生异常--------------")

12 }

13 }

14}

15

16public class NFDFlightDataTaskListener implements ServletContextListener {

17

18 public void contextInitialized(ServletContextEvent event) {

19 new TimerManager()

20 }

21

22 public void contextDestroyed(ServletContextEvent event) {

23 }

24

25}

然后要在web.xml里面配置监听器

1<listener>

2 <listener-class>

3 com.listener.NFDFlightDataTaskListener

4 </listener-class>

5</listener>

/**

* 普通thread

* 这是最常见的,创建一个thread,然后让它在while循环里一直运行着,

* 通过sleep方法来达到定时任务的效果。这样可以快速简单的实现,代码如下:

* @author GT

*

*/

public class Task1 {

public static void main(String[] args) {

// run in a second

final long timeInterval = 1000

Runnable runnable = new Runnable() {

public void run() {

while (true) {

// ------- code for task to run

System.out.println("Hello !!")

// ------- ends here

try {

Thread.sleep(timeInterval)

} catch (InterruptedException e) {

e.printStackTrace()

}

}

}

}

Thread thread = new Thread(runnable)

thread.start()

}

}

[java] view plain copy

import java.util.Timer

import java.util.TimerTask

/**

*

* 于第一种方式相比,优势 1>当启动和去取消任务时可以控制 2>第一次执行任务时可以指定你想要的delay时间

*

* 在实现时,Timer类可以调度任务,TimerTask则是通过在run()方法里实现具体任务。 Timer实例可以调度多任务,它是线程安全的。

* 当Timer的构造器被调用时,它创建了一个线程,这个线程可以用来调度任务。 下面是代码:

*

* @author GT

*

*/

public class Task2 {

public static void main(String[] args) {

TimerTask task = new TimerTask() {

@Override

public void run() {

// task to run goes here

System.out.println("Hello !!!")

}

}

Timer timer = new Timer()

long delay = 0

long intevalPeriod = 1 * 1000

// schedules the task to be run in an interval

timer.scheduleAtFixedRate(task, delay, intevalPeriod)

} // end of main

}

[java] view plain copy

import java.util.concurrent.Executors

import java.util.concurrent.ScheduledExecutorService

import java.util.concurrent.TimeUnit

/**

*

*

* ScheduledExecutorService是从Java SE5的java.util.concurrent里,做为并发工具类被引进的,这是最理想的定时任务实现方式。

* 相比于上两个方法,它有以下好处:

* 1>相比于Timer的单线程,它是通过线程池的方式来执行任务的

* 2>可以很灵活的去设定第一次执行任务delay时间

* 3>提供了良好的约定,以便设定执行的时间间隔

*

* 下面是实现代码,我们通过ScheduledExecutorService#scheduleAtFixedRate展示这个例子,通过代码里参数的控制,首次执行加了delay时间。

*

*

* @author GT

*

*/

public class Task3 {

public static void main(String[] args) {

Runnable runnable = new Runnable() {

public void run() {

// task to run goes here

System.out.println("Hello !!")

}

}

ScheduledExecutorService service = Executors

.newSingleThreadScheduledExecutor()

// 第二个参数为首次执行的延时时间,第三个参数为定时执行的间隔时间

service.scheduleAtFixedRate(runnable, 10, 1, TimeUnit.SECONDS)

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12019669.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存