Java定时器:详细介绍与实战应用

大家好,如果您还对java定时器不太了解,没有关系,今天就由本站为大家分享java定时器的知识,包括的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!

在Java编程中,定时器是一个非常重要的概念。它可以帮助我们实现任务的定时执行,比如定时发送邮件、定时清理缓存数据等。本文将深入解析Java定时器的原理和应用,并通过实战案例展示如何使用Java定时器。

一、Java定时器概述

1. 定时器的概念

定时器,顾名思义,就是用来定时执行任务的工具。在Java中,定时器通常指的是`java.util.Timer`和`java.util.concurrent.ScheduledExecutorService`这两个类。

2. 定时器的优势

使用定时器,我们可以轻松实现以下功能:

* 定时执行任务:比如定时发送邮件、定时清理缓存数据等。

* 周期性执行任务:比如定时检查系统状态、定时更新数据等。

* 精确控制任务执行时间:比如定时在特定时间执行任务。

二、Java定时器原理

1. Timer类

`Timer`类是Java 1.0引入的定时器类,它使用单线程调度任务。当有多个任务需要执行时,它们会按照提交的顺序依次执行。

2. TimerTask类

`TimerTask`类表示要执行的任务,它继承自`java.lang.Runnable`接口。当定时器执行任务时,它会调用`run()`方法。

3. ScheduledExecutorService类

`ScheduledExecutorService`类是Java 5引入的定时器类,它使用线程池来调度任务。相比于`Timer`类,`ScheduledExecutorService`类提供了更丰富的功能,比如周期性执行任务、精确控制任务执行时间等。

三、Java定时器实战应用

1. 使用Timer类实现定时任务

案例:定时发送邮件

“`java

import java.util.Timer;

import java.util.TimerTask;

public class TimerDemo {

public static void main(String[] args) {

Timer timer = new Timer();

TimerTask task = new TimerTask() {

@Override

public void run() {

// 发送邮件的代码

System.out.println(“

javaweb,监听器和定时器(Quartz)互相调控的问题

不明白你为什么要这样设计程序

通常情况下监听器只是用来启动定时器,剩下的工作都是让定时器去处理

因为你想,你的定时器怎么启动起来的?

肯定是交给监听器去启动,例如servlet监听器,servlet容器一创建就执行,也就是服务器一启动就执行,这个时候你在监听器里开启一个定时器就做事就行了

接下来就是让你的定时器去定时定时5秒去查询表A有没有数据如果有就处理就行了

定时器本身就是定时执行,因此不需要延时启动了

纯手工打字的,请采纳哈

JAVA中定时自动完成任务的实现

  JAVA中定时自动完成任务的实现要用到JAVA中的定时器TimerTask和监听器听起来貌似有点困难但是实现起来还是比较容易的!纸老虎~~!

  下面的列子很详细是关于定时向服务器上传(也可以是其他的动作这是看需要关于上传我博客有写过可以参考)文件的列子简单的步就可以实现

  首先创建动作bean

  package sun time;

  public class UploadFile{

  /**

  *实现上传的代码s省略可以看下我下面的篇日志

  __haiming/blog/static//使用*** arupload实现上传下载[有例子]

  __haiming/blog/static//使用Struts多文件上传

  */

  public void upload()

  {

  System out println(系统自动的上传文件了);

  }

  }

  创建定时器MyTaker并完成相应的功能

  package sun time;

  import java util Calendar;

  import java util TimerTask;

  import javax servlet ServletContext;

  public class MyTaker extends TimerTask{

  private static boolean isRun= false;

  private ServletContext context;

  private Calendar ca= Calendar getInstance();

  public MyTaker(ServletContext context)

  {

  ntext= context;

  }

  @Override

  public void run(){

  if(!isRun){

  if(==ca get(Calendar MINUTE)){

  isRun= true;

  context log(正在执行所加载的任务);

  UploadFile uf= new UploadFile();

  uf upload();

  isRun=false;

  context log(任务顺利完成);

  }

  }

  else

  {

  System out println(任务还没有执行完毕);

  }

  }

  }

  创建监听器ContextListener

  package sun time;

  import javax servlet ServletContextEvent;

  import javax servlet ServletContextListener;

  import sun time MyTaker;

  import java util*;

  public class ContexListener implements ServletContextListener{

  private Timer timer= null;

  @Override

  public void contextDestroyed(ServletContextEvent event){

  timer cancel();

  event getServletContext() log(任务列表已经销毁了);

  }

  @Override

  public void contextInitialized(ServletContextEvent event){

  timer= new Timer(true);

  event getServletContext() log(服务器已经启动了);

  timer schedule(new MyTaker(event getServletContext()));///每隔多长时间检查扫描一次

  event getServletContext() log(已经加载了任务的列表);

  }

  }

  最后一步就是在web xml中配置监听

  <! Java定时器>

  <listener>

  <listener class> sun time ContexListener</listener class>

lishixinzhi/Article/program/Java/hx/201311/26450

关于java定时器Timer的疑问,当执行时间大于间隔时间会怎样

当使用java.util.Timer时,如果执行时间大于间隔时间,会根据使用的不同方法有不同的行为:

fixeddelay模式:

行为:如果某次任务执行时间超过了设定的间隔时间,下一次任务的开始时间不会受到影响,依然会在上一次任务结束后,按照设定的间隔时间开始。示例:如果设定10秒间隔,但某次任务执行了15秒,那么下一次任务将在这次任务结束后的10秒开始。fixedrate模式:

行为:如果某次任务执行时间超过了设定的间隔时间,为了尽量保持固定的执行频率,Timer会智能地调整下一次任务的开始时间。具体表现为,如果某次任务超时,下一次任务可能会在没有完整间隔时间的情况下就开始,以“追赶”上预定的执行频率。示例:如果设定10秒一次任务,但某次任务执行了15秒,那么下一次任务可能会在下一次“预定时间”后的5秒开始,以此类推,直到任务执行时间恢复到设定的间隔时间以内。另外,如果使用javax.swing.Timer:

行为:这个Timer通常用于Java GUI应用中,它是在EDT上执行的。如果某次任务执行时间超过了设定的间隔时间,EDT会尝试智能合并任务。也就是说,如果连续的任务都超时,它们可能会被合并成一个任务来执行。示例:如果设定10秒周期的任务执行了15秒,那么下一次任务可能会与紧接着的任务合并,导致在一段时间内只执行一个“合并”后的任务,而不是按照设定的间隔时间连续执行。注意:虽然javax.swing.Timer也支持Fixed Rate模式,但通常不建议这样使用,因为这与EDT的工作方式和GUI应用的响应性设计原则不符。

好了,本文到此结束,如果可以帮助到大家,还望关注本站哦!

© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享