知识大全 Java定时器

Posted 工程

篇首语:学习知识要善于思考,思考,再思考。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Java定时器相关的知识,希望对你有一定的参考价值。

Java定时器  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  好多朋友用过Windows的任务计划 也有不少程序迷自己曾写过时钟报警 系统自动关机等趣味程序 可却很少有朋友在Web工程中实现过类似功能

  当Web工程启动时 定时器能自动开始计时 在整个Web工程的生命期里 定时器能在每晚深夜触发一次任务 因此定时器的存放位置也值得考查 不能简单的存在于单个Servlet或JavaBean中 必须能让定时器宿主的存活期为整个Web工程生命期 在工程启动时能自动加载运行 结合这两点 跟 Servlet上下文有关的侦听器就最合适不过了 通过在工程的配置文件中加以合理配置 会在工程启动时自动运行 并在整个工程生命期中处于监听状态

  下面就Servlet侦听器结合Java定时器来讲述整个实现过程 要运用Servlet侦听器需要实现 javax servlet ServletContextListener接口 同时实现它的contextInitialized (ServletContextEvent event)和contextDestroyed(ServletContextEvent event)两个接口函数 考虑定时器有个建立和销毁的过程 看了前面两个接口函数 就不容置疑的把建立的过程置入 contextInitialized 把销毁的过程置入contextDestroyed了

  我把ServletContextListener的实现类取名为ContextListener 在其内添加一个定时器 示例代码如下所示

  import java util Timer;

  import javax servlet ServletContextEvent;

  import javax servlet ServletContextListener;

  import javax servlet ServletException;

  import javax servlet ServletRequest;

  import javax servlet ServletResponse;

  import javax servlet HttpServlet;

  public class ContextListener

  extends HttpServlet

  implements ServletContextListener

  public ContextListener()

  

  private java util Timer timer = null;

  public void contextInitialized(ServletContextEvent event)

  timer = new java util Timer(true);

  event getServletContext() log( 定时器已启动 );

  timer schedule(new MyTask(event getServletContext()) * * );

  event getServletContext() log( 已经添加任务调度表 );

  

  public void contextDestroyed(ServletContextEvent event)

  timer cancel();

  event getServletContext() log( 定时器销毁 );

  

  

  以上代码中 timer schedule(new MyTask(event getServletContext()) * * )这一行为定时器调度语句 其中MyTask是自定义需要被调度的执行任务(在我的财政数据中心项目中就是报表计算引擎入口) 从 java util TimerTask继承 下面会重点讲述 第三个参数表示每小时(即 * * 毫秒)被触发一次 中间参数 表示无延迟 其它代码相当简单 不再详细说明

  下面介绍MyTask的实现 上面的代码中看到了在构造MyTask时 传入了javax servlet ServletContext类型参数 是为记录Servlet日志方便而传入 因此需要重载MyTask的构造函数(其父类java util TimerTask原构造函数是没有参数的) 在timer schedule()的调度中 设置了每小时调度一次 因此如果想实现调度任务每 小时被执行一次 还需要判断一下时钟点 以常量C_SCHEDULE_HOUR表示(晚上 点 也即 点) 同时为防止 小时执行下来 任务还未执行完(当然 一般任务是没有这么长的) 避免第二次又被调度以引起执行冲突 设置了当前是否正在执行的状态标志isRunning 示例代码如下所示

  import java util *;

  import javax servlet ServletContextEvent;

  import javax servlet ServletContextListener;

  import javax servlet ServletException;

  import javax servlet ServletRequest;

  import javax servlet ServletResponse;

  import javax servlet HttpServlet;

  import javax servlet *;

  public class MyTask extends TimerTask

  private static final int C_SCHEDULE_HOUR = ;

  private static boolean isRunning = false;

  private ServletContext context = null;

  public MyTask()

  

  public MyTask(ServletContext context)

  ntext = context;

  

  public void run()

  Calendar cal = Calendar getInstance();

  if (!isRunning)

  if (C_SCHEDULE_HOUR == cal get(Calendar HOUR_OF_DAY))

  isRunning = true;

  context log( 开始执行指定任务 );

  //TODO 添加自定义的详细任务 以下只是示例

  //系统定时接收邮件

  Email email=new Email();

  email recieve();

  isRunning = false;

  context log( 指定任务执行结束 );

  

  

  else

  context log( 上一次任务执行还未结束 );

  

  

  

  到这儿 ServletContextListener和MyTask的代码都已完整了 最后一步就是把ServletContextListener部署到您的Web工程中去 在您工程的web xml配置文件中加入如下三行

  <listener>

  <listener class> test ContextListener</listener class>

  </listener>

cha138/Article/program/Java/hx/201311/26421

相关参考

知识大全 Java定时任务Timer

Java定时任务Timer  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java定时任务用到的

知识大全 java定时启动线程

  在实际应用中很多情况需要定时运行程序比如分钟或者小时执行一次程序对此操作java和C#一样可以使用Timer计时器实现即javautilTimer中的Timer类  Timer的定义Timerti

知识大全 JAVA中定时自动完成任务的实现

JAVA中定时自动完成任务的实现  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  JAVA中定时自

知识大全 Java计时器Timer 使用

Java计时器Timer使用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  所有类型的Java应

知识大全 Java定时执行任务的三种方法

Java定时执行任务的三种方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 用JNI实现一个高精度的Java计时器

用JNI实现一个高精度的Java计时器  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &

可以用循环指令扩展定时器的定时时间吗?

  PLC是用系统程序实现定时器的定时功能的。在执行定时器指令时,不是等到定时时间到后再往下执行,因此在循环指令的循环体中加入定时器指令,不能扩展定时器的定时时间。

可以用循环指令扩展定时器的定时时间吗?

  PLC是用系统程序实现定时器的定时功能的。在执行定时器指令时,不是等到定时时间到后再往下执行,因此在循环指令的循环体中加入定时器指令,不能扩展定时器的定时时间。

要等到定时器的定时时间到才会往下执行程序吗?

  定时器的定时功能是用PLC的系统程序实现的,定时过程与用户程序的扫描执行是并行的〈即同时进行的〉,定时器的定时过程不会影响用户程序的扫描工作过程。  假设PLC的扫描周期为10ms,某定时器的时间

要等到定时器的定时时间到才会往下执行程序吗?

  定时器的定时功能是用PLC的系统程序实现的,定时过程与用户程序的扫描执行是并行的〈即同时进行的〉,定时器的定时过程不会影响用户程序的扫描工作过程。  假设PLC的扫描周期为10ms,某定时器的时间