用Java Timer API进行时间调度开发的相关注意点
2007-12-16 21:07
393 查看
在java.util这个包中可以找到Timer和TimerTask这两个类。Timer直接从Object继承,它相当于一个计时器,能够用它来指定某个时间来执行一项任务,或者每隔一定时间间隔反复执行同一个任务。创建一个Timer后,就会生成一个线程在背后运行,来控制任务的执行。而TimerTask就是用来实现某项任务的类,它实现了Runnable接口,因此相当于一个线程。
如何实现自己的任务调度?
1、继承TimerTask,注意TimerTask是实现Runnable接口的,因此只要重载run()方法即可。
2、创建Timer对象,调用schedule()方法。
相关注意点分析:
1、任务调度要优先考虑实时保证
由于Java的天性,并且在开发JDK的过程中要考虑到不同平台,而不同平台的线程调度机制是不同的,因此各种平台下JVM的线程调度机制也是不一致的。
从而Timer不能保证任务在所指定的时间内执行。另外由于TimerTask是实现Runnable接口的,在TimerTask被放进线程队列睡眠一段时间(wait)之后,当到了指定的该唤起该TimerTask时,由于执行的确切时机取决于JVM的调度策略和当前还有多少线程在等待CPU处理。因此就不能保证任务在所指定的时间内执行。通常在如下两种情况下导致任务延迟执行:
(1)、有大量线程在等待执行
(2)、GC机制的影响导致延迟
这也是为什么在Timer API中存在两组调度方法的原因。即:
(1)、schedule()
用固定延迟调度。使用本方法时,在任务执行中的每一个延迟会传播到后续的任务的执行。
(2)、scheduleAsFixedRate()
用固定比率调度。使用本方法时,所有后续执行根据初始执行的时间进行调度,从而希望减小延迟。
具体使用哪一个方法取决于哪些参数对你的程序或系统更重要。
2、每个Timer对象要在后台启动一个线程。这种性质在一些托管的环境下不推荐使用,比如在应用服务器中。因为这些线程不在容器的控制范围之内了。
如何实现自己的任务调度?
1、继承TimerTask,注意TimerTask是实现Runnable接口的,因此只要重载run()方法即可。
2、创建Timer对象,调用schedule()方法。
相关注意点分析:
1、任务调度要优先考虑实时保证
由于Java的天性,并且在开发JDK的过程中要考虑到不同平台,而不同平台的线程调度机制是不同的,因此各种平台下JVM的线程调度机制也是不一致的。
从而Timer不能保证任务在所指定的时间内执行。另外由于TimerTask是实现Runnable接口的,在TimerTask被放进线程队列睡眠一段时间(wait)之后,当到了指定的该唤起该TimerTask时,由于执行的确切时机取决于JVM的调度策略和当前还有多少线程在等待CPU处理。因此就不能保证任务在所指定的时间内执行。通常在如下两种情况下导致任务延迟执行:
(1)、有大量线程在等待执行
(2)、GC机制的影响导致延迟
这也是为什么在Timer API中存在两组调度方法的原因。即:
(1)、schedule()
用固定延迟调度。使用本方法时,在任务执行中的每一个延迟会传播到后续的任务的执行。
(2)、scheduleAsFixedRate()
用固定比率调度。使用本方法时,所有后续执行根据初始执行的时间进行调度,从而希望减小延迟。
具体使用哪一个方法取决于哪些参数对你的程序或系统更重要。
2、每个Timer对象要在后台启动一个线程。这种性质在一些托管的环境下不推荐使用,比如在应用服务器中。因为这些线程不在容器的控制范围之内了。
相关文章推荐
- 用Java Timer API进行时间调度开发的相关注意点
- 使用Java调用ElasticSearch提供的相关API进行数据搜索完整实例演示
- Java时间日期相关开发
- 使用Java调用ElasticSearch提供的相关API进行数据搜索完整实例演示
- 新浪微博API开放平台进行程序开发第一步(java)
- 【Android 应用开发】Android 网络编程 API笔记 - java.net 包 权限 地址 套接字 相关类 简介
- java timer时间调度调试理解
- 【Android 应用开发】Android 网络编程 API笔记 - java.net 包 权限 地址 套接字 相关类 简单介绍
- Timer与TimerTask的基本API,以及服务运行时改变调度时间
- Windows下使用Java调用ElasticSearch提供的相关API进行数据搜索完整实例演示
- 使用Java调用ElasticSearch提供的相关API进行数据搜索完整实例演示
- 【Android 应用开发】Android 网络编程 API笔记 - java.net 包 权限 地址 套接字 相关类 简介
- 嵌入式软件开发培训笔记——java第五天(API——math/string/集合/日期时间以及java线程)
- 利用hdfs的java api进行文件操作注意事项
- 用 Quartz 进行作业调度Quartz API(采用多面方式在 Java 应用程序中进行任务调度)
- 使用Java调用ElasticSearch提供的相关API进行数据搜索完整实例演示
- 【Android 应用开发】Android 网络编程 API笔记 - java.net 包相关 接口 api
- C#实现多级子目录Zip压缩解压实例 NET4.6下的UTC时间转换 [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案 .NET Core开发日志
- 【Android 应用开发】Android 网络编程 API笔记 - java.net 包相关 接口 api
- java API 跟时间相关类:Date/Calendar/GregorianCalendar/DateFormat/SimpleDateFormat