大家好,如果您还对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应用的响应性设计原则不符。
好了,本文到此结束,如果可以帮助到大家,还望关注本站哦!




