`
javaeye_hua
  • 浏览: 81561 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java 实现调度器

阅读更多
public class TimerTest implements TaskInter{

	
	/**调度任务**/
	@Override
	public void work() {
		// TODO Auto-generated method stub
		System.out.println("timer tast start work ...");
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		TimerTest test = new TimerTest();//调度任务实现类
		Date dt = new Date();//调度开始时间
		TimerTaskImpl task = new TimerTaskImpl(dt,Calendar.SECOND,5,test);//表示每隔5s执行一次
		TimerDispatcher dispatcher = new TimerDispatcher(dt,task);
		dispatcher.startDispatcher();
	}

}

拷贝附件timer.jar到lib目录,按照上述测试即可实现。 

2009-10-13 update:

最近测试发现,上次timer.jar有一个bug,在起始调度时间在当前时间之前时,会自动调用。

今天新发布的timer.jar,实现了首次调度时间为调度周期在当前时间之后(当前时间)时,避免上次出现的问题:

eg. 当前时间:2009-10-13 09:47:00

      调度指定时间:2009-10-13 08:47:00

      调度间隔:4h

首次调用时间为:2009-10-13 12:47:00,而不是在系统启动就首次调度。

0
0
分享到:
评论
2 楼 javaeye_hua 2011-07-18  
javalzbin 写道
感谢你的demo,呵呵,没看你的demo我都不知道什么叫调度器
不过我看了一下,我发现了一个问题,想问一下
/*****local task***********/
String dt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
String lt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(System.currentTimeMillis()));
if(this.task != null && dt.compareTo(lt) >= 0){
task.work();//调度工作
}
/******start next dispatcher*********/
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(calendarTime, interval);
TimerDispatcher dispatcher = new TimerDispatcher(calendar.getTime(),new TimerTaskImpl(calendar.getTime(),calendarTime,interval,task));
dispatcher.startDispatcher();
/****close local dispatcher***********/
this.timerCancel();

---------------------------------------------------------------------
this.timerCancel();

问题在这里,在你的demo中,每一次调度,你会把当前的Timer给取消,然后执行下次调度时,又会重新创建一个对象,其实我的想法是,这个Timer对象是不是可以共用。
即,首先,创建一个单例类,继承Timer,当服务启动时,只会创建一个Timer对象,那么,在这里:
public void startDispatcher(){
Timer timer = new Timer();
task.timer = timer;
timer.schedule(task, date);
}
---------------------------------------
Timer timer 的创建就由单例类来提供对象,即
Timer timer = Singleton.getInstance();
这样一来,只会有一个timer对象。
而在:
----------------------------------------------------------
/*****local task***********/
String dt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
String lt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(System.currentTimeMillis()));
if(this.task != null && dt.compareTo(lt) >= 0){
task.work();//调度工作
}
/******start next dispatcher*********/
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(calendarTime, interval);
TimerDispatcher dispatcher = new TimerDispatcher(calendar.getTime(),new TimerTaskImpl(calendar.getTime(),calendarTime,interval,task));
dispatcher.startDispatcher();
/****close local dispatcher***********/
this.timerCancel();
-------------------------------------------------------这里,
将不在执行 this.timerCancel();这行代码,这样就可以达到共享一个Timer实例

其实这个问题是我今天把这个调度器集成到我的web项目的时候发现的,我添加了一个ServletContextListener,把Timer对象声明成全局变量,在初始化的方法中contextInitialized创建Timer对象,这样,在我tomcat启动时,就会启动调度器服务,然后我想在我web服务停止时,会调用销毁的
contextDestroyed方法,在这个方法里面,调用timer.cancel(),结果发现,tomcat停止了,调度器服务依然还在执行,此时我发现,然后我在销毁方法contextDestroyed中拿到的timer对象,不是当前调度器使用的Timer对象,所以没法使用 timer.cancel()方法,拿到的时候已经在this.timerCancel()终止过的对象,这种情况,除非在整个服务当中,共享一个Timer对象,要不然在销毁的contextDestroyed方法中没办法终止调度器,而且,把Timer创建成共享对象,这样也避免了对象的频繁创建,对象的创建其实还是很耗时的

这就是我通过你提供的demo发现的一个小问题,不知道我的想法对不对



谢谢你的关注。
当时制作这个是有一个比较着急的模块需要一个定时触发工作的触发器,临时写的,很不完善。您提的建议非常好,我已经进行了重构。
希望以后多多交流。
/握手
1 楼 javalzbin 2011-07-14  
感谢你的demo,呵呵,没看你的demo我都不知道什么叫调度器
不过我看了一下,我发现了一个问题,想问一下
/*****local task***********/
String dt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
String lt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(System.currentTimeMillis()));
if(this.task != null && dt.compareTo(lt) >= 0){
task.work();//调度工作
}
/******start next dispatcher*********/
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(calendarTime, interval);
TimerDispatcher dispatcher = new TimerDispatcher(calendar.getTime(),new TimerTaskImpl(calendar.getTime(),calendarTime,interval,task));
dispatcher.startDispatcher();
/****close local dispatcher***********/
this.timerCancel();

---------------------------------------------------------------------
this.timerCancel();

问题在这里,在你的demo中,每一次调度,你会把当前的Timer给取消,然后执行下次调度时,又会重新创建一个对象,其实我的想法是,这个Timer对象是不是可以共用。
即,首先,创建一个单例类,继承Timer,当服务启动时,只会创建一个Timer对象,那么,在这里:
public void startDispatcher(){
Timer timer = new Timer();
task.timer = timer;
timer.schedule(task, date);
}
---------------------------------------
Timer timer 的创建就由单例类来提供对象,即
Timer timer = Singleton.getInstance();
这样一来,只会有一个timer对象。
而在:
----------------------------------------------------------
/*****local task***********/
String dt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
String lt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(System.currentTimeMillis()));
if(this.task != null && dt.compareTo(lt) >= 0){
task.work();//调度工作
}
/******start next dispatcher*********/
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(calendarTime, interval);
TimerDispatcher dispatcher = new TimerDispatcher(calendar.getTime(),new TimerTaskImpl(calendar.getTime(),calendarTime,interval,task));
dispatcher.startDispatcher();
/****close local dispatcher***********/
this.timerCancel();
-------------------------------------------------------这里,
将不在执行 this.timerCancel();这行代码,这样就可以达到共享一个Timer实例

其实这个问题是我今天把这个调度器集成到我的web项目的时候发现的,我添加了一个ServletContextListener,把Timer对象声明成全局变量,在初始化的方法中contextInitialized创建Timer对象,这样,在我tomcat启动时,就会启动调度器服务,然后我想在我web服务停止时,会调用销毁的
contextDestroyed方法,在这个方法里面,调用timer.cancel(),结果发现,tomcat停止了,调度器服务依然还在执行,此时我发现,然后我在销毁方法contextDestroyed中拿到的timer对象,不是当前调度器使用的Timer对象,所以没法使用 timer.cancel()方法,拿到的时候已经在this.timerCancel()终止过的对象,这种情况,除非在整个服务当中,共享一个Timer对象,要不然在销毁的contextDestroyed方法中没办法终止调度器,而且,把Timer创建成共享对象,这样也避免了对象的频繁创建,对象的创建其实还是很耗时的

这就是我通过你提供的demo发现的一个小问题,不知道我的想法对不对

相关推荐

    java实现任务调度

    Java实现任务调度的过程中,涉及到的关键技术和工具包括Quartz调度器和Spring框架。Quartz是一个功能强大的开源作业调度系统,它可以用来整合到Java应用程序中,以实现作业调度的功能。Spring框架是一个广泛使用的...

    模拟操作系统页面调度Java实现

    首先,我们来看标题"模拟操作系统页面调度Java实现"。这意味着这个程序会使用Java语言来模拟实际操作系统中的页面调度算法,如LRU(最近最少使用)、FIFO(先进先出)等。这些算法的目标是在多道程序环境下,解决...

    批处理作业调度回溯法java实现

    批处理作业调度回溯法java实现 批处理作业调度回溯法是一种解决作业调度问题的算法,它通过回溯法来搜索所有可能的解决方案,以找到最佳的作业调度方式。在这个Java实现的批处理作业调度程序中,我们使用回溯法来...

    电梯调度算法(java实现)

    在这个Java实现中,我们将深入探讨电梯调度算法的基本原理、常见策略以及如何在Java编程环境中进行模拟。 电梯调度算法的核心目标是有效地服务楼层数字上的请求,以减少乘客的等待时间和电梯的移动距离。这个过程...

    水库调度java程序,水库调度运行方案,Java

    标题中的“水库调度java程序,水库调度运行方案,Java”表明了这个压缩包包含的是一个用Java编程语言实现的水库调度系统。水库调度是水资源管理中的一个重要环节,它涉及到对水库来水、用水需求以及出水流量的科学预测...

    调度算法 java源代码

    Java实现调度算法通常会涉及到线程管理和同步机制,如`Thread`类、`Runnable`接口,以及`synchronized`关键字、`wait()`、`notify()`等方法。在设计和实现调度算法时,需关注以下几点: - **并发控制**:确保多线程...

    Java模拟操作系统实验之四种进程调度算法实现(FCFS,SJF,RR,HRN)

    实验代码通常包含进程类(表示进程属性如执行时间、到达时间等)、调度器类(负责调度决策)以及主程序(生成随机进程和调用调度算法)。注释清晰的代码有助于理解每一步操作,并方便遇到问题时进行调试和改进。 ...

    java实现的电梯调度

    操作系统项目,用java实现的电梯调度。五部电梯,可同时工作,模拟线程调度。 操作系统项目,用java实现的电梯调度。五部电梯,可同时工作,模拟线程调度。 操作系统项目,用java实现的电梯调度。五部电梯,可同时...

    Java实现模拟单处理器的进程调度.zip

    本项目“Java实现模拟单处理器的进程调度”聚焦于这一关键领域,通过Java编程语言来模拟真实操作系统中的调度算法。让我们深入探讨这个主题,了解如何使用Java来实现这个过程。 首先,我们要理解进程调度的基本概念...

    JAVA操作系统实验进程调度图形化模拟程序

    本文将深入探讨“JAVA操作系统实验进程调度图形化模拟程序”,它基于JAVA 16语言实现,提供了图形用户界面(GUI)来直观展示进程调度的过程。 首先,我们要了解进程调度的基本概念。在多任务操作系统中,多个进程会...

    java 进程调度算法模拟

    在Java中实现这些算法,通常需要定义一个进程类来存储进程信息(如进程ID、到达时间、执行时间、优先级等),并编写调度器类来管理进程队列,模拟CPU的分配。你可以通过`src`目录中的代码,了解如何用Java编程实现...

    java设计一个按优先数调度算法实现处理器调度的程序。

    ### Java设计一个按优先数调度算法实现处理器调度的程序 #### 实验背景与目标 本实验旨在通过Java语言实现一种基于优先数的处理器调度算法。该算法的核心在于根据进程的优先级来决定其运行顺序,优先级高的进程...

    磁盘调度算法java实现

    本项目中,这些算法的Java实现可以帮助开发者和学习者深入理解它们的运作机制。通过用户界面,可以直观地看到不同算法对磁盘请求序列的影响,而结果记录功能则能帮助分析各种情况下的性能差异。这不仅能够提升理论...

    java进程调度算法

    然后,你需要一个调度器类来管理这些进程,根据所选的调度算法做出决策。同时,为了可视化这些过程,可以使用Java的图形用户界面(GUI)组件,如JFrame和JPanel,来展示进程的状态和时间变化。 此外,你可能还需要...

    Java实现的批处理作业调度问题算法

    这是一个用Java实现解决批处理作业调度问题的算法

    java电梯调度系统

    在Java编程语言中实现电梯调度系统,涉及到多个关键知识点,包括但不限于数据结构、算法设计、多线程同步以及事件驱动编程。 1. **数据结构**: - **楼层表示**:通常用整数或枚举类型来表示每层楼,如`int floor`...

    Java操作系统磁盘调度算法

    Java实现时,可以维护两个队列,分别存储上升和下降方向上的请求,根据磁头当前方向选择合适的队列进行服务。 在"OSTest3"这个文件中,可能包含了实现上述三种算法的Java代码示例,这些代码可以帮助理解每种算法的...

Global site tag (gtag.js) - Google Analytics