标签: 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)
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)