×

java定时器

java定时器(java定时器任务是否会延迟执行)

admin admin 发表于2023-04-12 22:39:08 浏览54 评论0

抢沙发发表评论

本文目录一览:

java定时器使用

;   定时器类Timer在java util包中 使用时 先实例化 然后使用实例的schedule(TimerTask task long delay)方法 设定指定的任务task在指定的延迟delay后执行 定时器任务类TimerTask是抽象类 继承并重写其run()方法 可实现具体任务         schedule(TimerTask task Date time)设定指定任务task在指定时间time执行         cancel()方法结束这个定时器         schedule(TimerTask task long delay long period)方法设定指定任务task在指定延迟delay后进行固定延迟peroid的执行         scheduleAtFixedRate(TimerTask task long delay long period)方法设定指定任务task在指定延迟delay后进行固定频率peroid的执行         要实现一个定时任务 运用java中的Timer和TimerTask类可以非常容易实现实时调用处理函数 这两个类使用起来非燃滚枯常方便 可以完成我们对定时器的绝大多数需要         看个简单的例子         import java io IOException;        import java util Timer;        public class TimerTest {        public static void main(String[] args){        Timer timer = new Timer()         timer schedule(new MyTask() ) //在 秒后执行此任务 每次间隔 秒 如果传递一个Data参数 就可以在某个固定的时间执行这个任务         while(true){//这个是用来停止此任务的 否则就一直循环执行此任务了        try {        int ch = System in read()         if(ch c == ){        timer cancel() //使用这个方法退出任务        }        } catch (IOException e) {        // TODO Auto generated catch block        e printStackTrace()         }        }        }        static class MyTask extends java util TimerTask{        @Override        public void run() {        // TODO Auto generated method stub        System out println( ________ )

        }        }        }        Servlet侦听器结合Java定时器实现任务计划调度[转]        好多朋友用过Windows的任务计划 也有不少程序迷自己曾写过时钟报警 系统自动关机等趣味程序 可却很少有朋友在Web工程中实现过类似功能 今天有空把笔者先前曾在Tomcat上实现的类似功能 搬出来与大家共享         早在几年前 我公司跟某市财政局合作项目开发 为加强财政局对所属单位财务状况的有效监管 开发 实施了财政局数据中心项目 此项目采用B/S加C/S混合结构模式 财政局Web服务器上架设数据同步接收装置 由市属单位每天下班前把财务信息通过HTTP协议上传至财政局中心服务器 与Web服务器上的接收装置对接 财政局内部各部门需要查阅大量财务信息 获取完备的市属单位当前备判财务状况信息 各部门按职能划分 需要准确的获取各部门各自所关注的汇总信息 以财政报表的形式提供         因财政数据量大 实时计算财政报表速度较慢 当初就考虑用报表缓存来减轻服务器的负担 但用缓存需要一个合理的缓存更新机制 考虑到各市属单位每天下班前才把财务数据上传 财政局每天所查看到的财务信息其实并不包括当天(除非有某位领导等到所属单位全部上传完之后才来查看信息 应该已经下班了) 所以要是能实现任务计划调度 在每晚深夜把当天及历史财务信息汇总 更新缓存皮洞 速度瓶颈不就解决了吗         当时由于系统核心是基于Web部署的 报表计算引擎也相应的部署在Tomcat容器上 因此如果想要借用Windows的任务计划来实现定时计算 就需要额外编写普通桌面应用程序接口 稍显复杂 于是就琢磨着想在Web上实现 经过查阅较多相关资料 发现Java定时器(java util Timer)有定时触发计划任务的功能 通过配置定时器的间隔时间 在某一间隔时间段之后会自动有规律的调用预先所安排的计划任务(java util TimerTask) 另外 由于我们希望当Web工程启动时 定时器能自动开始计时 在整个Web工程的生命期里 定时器能在每晚深夜触发一次报表计算引擎 因此定时器的存放位置也值得考查 不能简单的存在于单个Servlet或JavaBean中 必须能让定时器宿主的存活期为整个Web工程生命期 在工程启动时能自动加载运行 结合这两点 跟Servlet上下文有关的侦听器就最合适不过了 通过在工程的配置文件中加以合理配置 会在工程启动时自动运行 并在整个工程生命期中处于监听状态         下面就Servlet侦听器结合Java定时器来讲述整个实现过程 要运用Servlet侦听器需要实现javax servlet ServletContextListener接口 同时实现它的contextInitialized(ServletContextEvent event)和contextDestroyed(ServletContextEvent event)两个接口函数 考虑定时器有个建立和销毁的过程 看了前面两个接口函数 就不容置疑的把建立的过程置入contextInitialized 把销毁的过程置入contextDestroyed了         我把ServletContextListener的实现类取名为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 示例代码如下所示         private static final int C_SCHEDULE_HOUR   = ;        private static boolean isRunning = false;        private ServletContext context = null;        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 添加自定义的详细任务 以下只是示例        int i = ;        while (i++ ) {        context log( 已完成任务的 + i + / + )         }        isRunning = false;        context log( 指定任务执行结束 )         }        } else {        context log( 上一次任务执行还未结束 )         }        }        上面代码中 //TODO…… 之下四行是真正被调度执行的演示代码(在我的财政数据中心项目中就是报表计算过程) 您可以换成自己希望执行的语句         到这儿 ServletContextListener和MyTask的代码都已完整了 最后一步就是把ServletContextListener部署到您的Web工程中去 在您工程的web xml配置文件中加入如下三行         test ContextListener        当然 上面的 test得换成您自己的包名了 保存web xml文件后 把工程打包部署到Tomcat中即可 任务会在每晚 点至凌晨 点之间被执行 上面的代码会在Tomcat的日志文件中记录如下         : : 开始执行指定任务        : : 已完成任务的 /         ……        : : 已完成任务的 /         : : 指定任务执行结束 lishixinzhi/Article/program/Java/hx/201311/25851-java定时器

java的定时器怎么锁

1、首先在java创建一个thread文档。

2、肆橘其次使用thread文档在while循环里一直运行着。

3、最后通过sleep方法来达裂悄团到定时器加锁效果即运闷可。

在java中如何让定时器只启动一次?

具体的做法:棚举中

Timer timer = new Timer();

timer.schedule(new MyTask(), 1000)。

Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。

Java语言作为静态面向对象编程答纯语言的代表,极链山好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。

Java定时器

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

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

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

我把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继承 下面会重点讲述 第三个参数表示每小时(即 * * 毫秒)被触发一次 中间参数 表示无延迟 其它代码相当简单 不再详细说明 -java定时器

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

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配置文件中加入如下三行 -java定时器

listener

listener class test ContextListener/listener class

/listener

lishixinzhi/Article/program/Java/hx/201311/26421

java的定时器是否会提前执行

定时器不会提前执行。基础知识java.util.Timer一种线程设施,用于安排以后在后台线宏烂程中执行的任务。可安排任务执行一次,或者定期岁败重复执行。此类是线程安全的乎绝颤:多个线程可以共享单个Timer对象而无需进行外部同步。java.util.TimerTask由Timer安排为一次执行或重复执行的任务。-java定时器