在Java中使用定时任务的最佳实践
来源:互联网 发布:正品代购的软件 编辑:程序博客网 时间:2024/05/07 07:19
之前大部分人在遇到需要使用定时任务的时候首先会想到Timer类,用法一般就是:
不过在JDK5.0之后就不建议使用这个Timer了,因为它有很多的缺陷。
在新的java.util.concurrent包中的ScheduledExecutorService可以替代这个Timer:
使用方法举例:
据我所知这个就是定时任务的最佳实践了,不知道大家还有没有更好的建议
- new Timer("timer").schedule(new TimerTask() {
- @Override
- public void run() {
- System.out.println("执行任务");
- }
- }, 1000L, 1000L);
不过在JDK5.0之后就不建议使用这个Timer了,因为它有很多的缺陷。
在新的java.util.concurrent包中的ScheduledExecutorService可以替代这个Timer:
使用方法举例:
- ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1);
- exec.scheduleAtFixedRate(new Runnable() {
- public void run() {
- try{
- throw new RuntimeException();
- }catch (Exception e){
- System.out.println("RuntimeException catched");
- }
- }
- }, 1000, 5000, TimeUnit.MILLISECONDS);
理由:
第1:Timer在执行所有定时任务的时候只会创建一个线程。如果某个任务执行时间过长,那么将破坏其他TimeTask的定时精确性。
第2:如果TimerTask抛出一个UncheckedException,那么Timer将表现出很挫的行为。Timer并不捕获异常,因此当TimerTask抛出UncheckedException时候将终止定时线程,比如常见的一个NullPointerException。这种情况下,Timer不会恢复线程执行,而是会错误的任务整个Timer都取消掉。因此,已经被调度但尚未执行的Task将不会执行了,新的任务也不会调度,也就是常见的线程泄露。
而ScheduledThreadPoolExecutor能正确处理这些表现出错误行为的任务。
因此,如果您的JDK是5.0以上的,那么建议不要使用过时的Timer类了。
- SchedulerFactory sf = new StdSchedulerFactory();
- Scheduler sched = sf.getScheduler();
- JobDetail job = newJob(SimpleJob.class)
- .withIdentity("job1", "group1")
- .build();
- CronTrigger trigger = newTrigger()
- .withIdentity("trigger1", "group1")
- .withSchedule(cronSchedule("0/20 * * * * ?"))
- .build();
- Date ft = sched.scheduleJob(job, trigger);
- sched.start();
据我所知这个就是定时任务的最佳实践了,不知道大家还有没有更好的建议
- 在Java中使用定时任务的最佳实践
- 在Java中使用定时任务的最佳实践
- Android中(Service )服务的最佳实践——后台执行的定时任务
- Android中后台任务的最佳实践
- Quartz 在Java Web Application中使用 定时任务
- 在objc项目中使用常量的最佳实践(JAVA和as3)好像都是这样
- 在ios项目中使用常量的最佳实践
- iOS-在objc项目中使用常量的最佳实践
- Java 定时任务的使用
- 在spring中使用定时任务
- 在 Java 应用程序中定时执行任务
- 定时任务:Java中Timer和TimerTask的使用
- 定时任务:Java中Timer和TimerTask的使用
- 定时任务:Java中Timer和TimerTask的使用
- 【整理】定时任务:Java中Timer和TimerTask的使用
- 定时任务:Java中Timer和TimerTask的使用
- 定时任务:Java中Timer和TimerTask的使用
- 定时任务:Java中Timer和TimerTask的使用
- 红外接收头引脚定义
- Struts2 入门 三(Struts Action类的实现方式 接收参数的方式 )
- poj 1020
- Linux平台下基于BitTorrent应用层协议的下载软件开发--peer交互模块(torrent.c)
- STM32F2xx的定时器的应用
- 在Java中使用定时任务的最佳实践
- Linux平台下基于BitTorrent应用层协议的下载软件开发--peer交互模块(torrent.h)
- STM32F2XX之RCC配置
- Linux平台下基于BitTorrent应用层协议的下载软件开发--tracker服务器交互模块(tracker.c)
- STM32之ADC 一个8通道DMA程序
- unix的malloc/free函数的简单实现及思考
- vim 用法
- STM32新建工程步骤
- Linux平台下基于BitTorrent应用层协议的下载软件开发--tracker服务器交互模块(tracker.h)