发布网友 发布时间:2022-04-30 16:46
共1个回答
热心网友 时间:2022-04-14 10:14
摘要private java.util.Timer timer = null; public void contextInitialized(ServletContextEvent event) { timer = new java.util.Timer(true); event.getServletContext().log("定时器已启动"); timer.schele(new MyTask(event.getServletContext()), 0, 60*60*1000); event.getServletContext().log("已经添加任务调度表"); } public void contextDestroyed(ServletContextEvent event) { timer.cancel(); event.getServletContext().log("定时器销毁"); } 以上代码中, timer.schele(new MyTask(event.getServletContext()), 0, 60*60*1000)这一行为定时器调度语句,其中MyTask是自定义需要被调度的执行任务(在我的财政数据中心项目中就是报表计算引擎入口),从java.util.TimerTask继承,下面会重点讲述,第三个参数表示每小时(即60*60*1000毫秒)被触发一次,中间参数0表示无延迟。其它代码相当简单咨询记录 · 回答于2021-12-27定时器联动额外程序创建两个任务,每个任务有单独的定时器,利用一个按键触发(自动触发也可以),第一个任务开启后执行定时器读秒,串口输出定时器1启动,读秒结束串口输出定时器1删除,并打开第二个任务,执行定时器读秒,串口输出定时器2启动,读秒结束串口输出定时器2删除,程序结束您好,我这边正在为您查询,请稍等片刻,我这边马上回复您~您好,很高兴为您解答,定时器类Timer在java.util包中。使用时,先实例化,然后使用实例的schele(TimerTask task, long delay)方法,设定指定的任务task在指定的延迟delay后执行。定时器任务类TimerTask是抽象类,继承并重写其run()方法,可实现具体任务。schele(TimerTask task, Date time)设定指定任务task在指定时间time执行。cancel()方法结束这个定时器。schele(TimerTask task, long delay, long period)方法设定指定任务task在指定延迟delay后进行固定延迟peroid的执行。scheleAtFixedRate(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.schele(new MyTask(), 1000, 2000);//在1秒后执行此任务,每次间隔2秒,如果传递一个Data参数,就可以在某个固定的时间执行这个任务.while(true){//这个是用来停止此任务的,否则就一直循环执行此任务了try {int ch = System.in.read();if(ch-'c'==0){timer.cancel();//使用这个方法退出任务}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}static class MyTask extends java.util.TimerTask{@Overridepublic void run() {// TODO Auto-generated method stubSystem.out.println("________");}}}private java.util.Timer timer = null; public void contextInitialized(ServletContextEvent event) { timer = new java.util.Timer(true); event.getServletContext().log("定时器已启动"); timer.schele(new MyTask(event.getServletContext()), 0, 60*60*1000); event.getServletContext().log("已经添加任务调度表"); } public void contextDestroyed(ServletContextEvent event) { timer.cancel(); event.getServletContext().log("定时器销毁"); } 以上代码中, timer.schele(new MyTask(event.getServletContext()), 0, 60*60*1000)这一行为定时器调度语句,其中MyTask是自定义需要被调度的执行任务(在我的财政数据中心项目中就是报表计算引擎入口),从java.util.TimerTask继承,下面会重点讲述,第三个参数表示每小时(即60*60*1000毫秒)被触发一次,中间参数0表示无延迟。其它代码相当简单上面的代码中看到了在构造MyTask时,传入了javax.servlet.ServletContext类型参数,是为记录Servlet日志方便而传入,因此需要重载MyTask的构造函数(其父类java.util.TimerTask原构造函数是没有参数的)。在timer.schele()的调度中,设置了每小时调度一次,因此如果想实现调度任务每24小时被执行一次,还需要判断一下时钟点,以常量C_SCHEDULE_HOUR表示(晚上12点,也即0点)。同时为防止24小时执行下来,任务还未执行完(当然,一般任务是没有这么长的),避免第二次又被调度以引起执行冲突,设置了当前是否正在执行的状态标志isRunning。示例代码如下所示: private static final int C_SCHEDULE_HOUR = 0; private static boolean isRunning = false; private ServletContext context = null; public MyTask(ServletContext context) { this.context = 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 = 0; while (i++ < 10) { cont有直接操作的步骤代码呢吗private java.util.Timer timer = null; public void contextInitialized(ServletContextEvent event) { timer = new java.util.Timer(true); event.getServletContext().log("定时器已启动"); timer.schele(new MyTask(event.getServletContext()), 0, 60*60*1000); event.getServletContext().log("已经添加任务调度表"); } public void contextDestroyed(ServletContextEvent event) { timer.cancel(); event.getServletContext().log("定时器销毁"); }亲,没了吗这个任务求解