Java定时器
java定时器的使用(Scheduler )
ip = dataMap.getString("ip" + i);
for (int j = 0; j < tablenameLength; j++) {
scheduler.DEFAULT_GROUP, time);
//将作业和触发器添加到调度器
scheduler.scheduleJob(jobDetail, trigger);
try{
//建立作业调度器
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
//判断作业调度内是否有作业,如果有将其删除
if (!scheduler.isShutdown()) {
WebApplicationContext wc=(WebApplicationContext)dataMap.get("wcx");
String ip = "";
String tablename = "";
scheduler.deleteJob("ReceiveOnTimed", Scheduler.DEFAULT_GROUP);
}
//删除调度器的作业后,新建一个我们现在要完成的作业,该作业所需要的类是ReceiveJobd.class,作业名字是ReceiveOnTimes,所属分组是Scheduler.DEFAULT_GROUP
ea.start();
}
}
Scheduler scheduler = (Scheduler) dataMap.get("scheduler");
java 定时器用法
Java定时器用法详解一、简介Java定时器(Timer)是Java编程语言中用于实现定时任务的一种工具。
它允许开发者在指定的时间间隔内执行特定的代码块,从而实现定时操作。
本文将详细介绍Java定时器的用法,包括创建定时器、设置任务、启动和停止定时器等内容。
二、创建定时器在Java中,要使用定时器,首先需要导入`java.util.Timer`类。
创建定时器的方法如下:import java.util.Timer;public class MyTimer {public static void main(String[] args) {Timer timer = new Timer();}}三、设置任务定时器的核心功能是执行定时任务,因此需要为定时器设置一个任务。
在Java 中,可以通过创建一个继承自`java.util.TimerTask`的类来实现定时任务。
以下是一个简单的示例:import java.util.TimerTask;class MyTask extends TimerTask {@Overridepublic void run() {System.out.println("定时任务执行");}}四、启动定时器创建好定时器和任务后,接下来需要启动定时器。
可以使用`schedule()`方法来设置定时器的任务和执行间隔。
以下是一个完整的示例:import java.util.Timer;import java.util.TimerTask;class MyTask extends TimerTask {@Overridepublic void run() {System.out.println("定时任务执行");}}public class MyTimer {public static void main(String[] args) {Timer timer = new Timer();MyTask task = new MyTask();timer.schedule(task, 0, 1000); // 立即执行,然后每隔1秒执行一次}}五、停止定时器在某些情况下,可能需要停止定时器的执行。
JAVA获取当前时间以及JAVA_Spring定时器
JAVA获取当前时间____以及____JAVA_Spring定时器1Java获取当前时间方法一:public static void main(String[] args) {Date date = new Date();cal = Calendar.getInstance();Calendar//2011-1-8DateFormat d1 = DateFormat.getDateInstance();str1 = d1.format(date);String//2011-1-8 11:11:32DateFormat d2 = DateFormat.getDateTimeInstance();str2 = d2.format(date);String//11:11:32DateFormat d3 = DateFormat.getTimeInstance();str3 = d3.format(date);String//11-1-8 上午11:11DateFormat d4 = DateFormat.getInstance();str4 = d4.format(date);String//2011年1月8日星期六上午11时11分32秒 CSTDateFormat d5 =DateFormat.getDateTimeInstance(DateFormat.FULL,DateFormat.FULL);str5 = d5.format(date);String//2011年1月8日上午11时11分32秒DateFormat d6 =DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG);str6 = d6.format(date);String//11-1-8 上午11:11DateFormat d7 =DateFormat.getDateTimeInstance(DateFormat.SHORT,DateFormat.SHORT);str7 = d7.format(date);String//2011-1-8 11:11:32DateFormat d8 =DateFormat.getDateTimeInstance(DateFormat.MEDIUM,DateFormat.MEDIUM);String str8 = d8.format(date);2 }方法二:public static void main(String[] args) {Calendar cal = Calendar.getInstance();int year = cal.get(Calendar.YEAR); //年份int month=cal.get(Calendar.MONTH); //月份,从0开始计int day=cal.get(Calendar.DATE); //日//分钟int minute=cal.get(Calendar.MINUTE);int hour=cal.get(Calendar.HOUR); //时钟//秒钟int second=cal.get(Calendar.SECOND);int WeekOfYear = cal.get(Calendar.DAY_OF_WEEK); //一周的第几天}另外方式:SimpleDateFormat sdf1 = new SimpleDateFormat("HH");String dt = sdf1.format(new Date());int timeInt = Integer.parseInt(dt); //获取当前时钟(24小时制)//页面显示当前月的月份mjava.util.Date dt = new java.util.Date();int m =dt.getMonth();//当前月第一天day_firstGregorianCalendar gc = (GregorianCalendar) Calendar.getInstance();Date date = new Date();gc.setTime(date);gc.set(Calendar.DAY_OF_MONTH, 1);String day_first = df.format(gc.getTime());//当前月最后一天day_endCalendar cal = Calendar.getInstance();cal.add(cal.MONTH,1);cal.set(cal.DATE,1);cal.add(cal.DATE,-1);java.text.SimpleDateFormat df = newjava.text.SimpleDateFormat("yyyy-MM-dd");String day_end=df.format(cal.getTime());3 java_Spring定时器applicationContext.xml内容:<bean id="timeFinish"class="com.pms.action.safe.ExamineTimeNoFinish" scope="prototype"><!—在ExamineTimeNoFinish里面必须有examineService的get、set方法--><property name="examineService"ref="examineService"/></bean><bean id="myTimeFinish"class="org.springframework.scheduling.timer.ScheduledTimerTask"> <property name="timerTask"ref="timeFinish"></property><!-- 指定任务运行周期,单位毫秒 ,这里指定时间为30秒完成一次任务--><property name="period"value="30000"></property><!-- 指定任务延迟时间,单位毫秒 ,这里指定时间为15秒完成一次任务--><property name="delay"value="15000"></property></bean><bean class="org.springframework.scheduling.timer.TimerFactoryBean"> <property name="scheduledTimerTasks"><list><ref bean="myTimeFinish"/></list></property></bean>ExamineTimeNoFinish.java内容:public class ExamineTimeNoFinish extends TimerTask{private ExamineService examineService;public ExamineService getExamineService() {return examineService;}public void setExamineService(ExamineService examineService) { this.examineService = examineService;}public void run() {//内容}}。
JAVA定时器的三种方法(详细注解)
JAVA定时器的三种方法(详细注解)在Java中,有三种主要的定时器方法可以实现任务的定时执行。
这些方法包括Timer类、ScheduledThreadPoolExecutor类和TimerTask类。
下面将详细介绍这三种定时器方法的使用。
1. Timer类:Timer类是Java提供的一个基本的定时器类,可以用于在指定的时间间隔内执行指定的任务。
Timer类提供了schedule(和scheduleAtFixedRate(两个方法,用于按照指定的时间间隔执行任务。
(1)schedule(方法:该方法用于在指定的时间间隔后执行任务。
它的语法如下:public void schedule(TimerTask task, long delay)参数task表示要执行的任务,它是一个实现了TimerTask接口的类的实例。
参数delay表示延迟的时间,以毫秒为单位。
例如,下面的代码使用Timer类的schedule(方法,在延迟2秒后执行一个任务:```public void ruSystem.out.println("任务执行了");}},2000);```当运行上述代码后,程序将会输出"任务执行了"。
(2)scheduleAtFixedRate(方法:该方法用于以固定的时间间隔执行任务。
它的语法如下:public void scheduleAtFixedRate(TimerTask task, long delay, long period)参数task表示要执行的任务,它是一个实现了TimerTask接口的类的实例。
参数delay表示延迟的时间,以毫秒为单位。
参数period表示每次任务执行间隔的时间,也是以毫秒为单位。
例如,下面的代码使用Timer类的scheduleAtFixedRate(方法,延迟2秒后开始执行一个任务,并且每隔1秒执行一次:```public void ruSystem.out.println("任务执行了");}},2000,1000);```当运行上述代码后,程序将会输出"任务执行了",并且每隔1秒输出一次。
java 定时器原理
java 定时器原理Java定时器原理Java定时器是一种非常常见的编程工具,它可以在指定的时间间隔内执行特定的任务。
在Java中,定时器是通过Timer类来实现的。
Timer类是Java.util包中的一个类,它提供了一种简单的方法来安排在指定时间间隔内执行任务的机制。
Java定时器的原理是基于Java中的线程机制实现的。
在Java中,每个定时器都是一个线程,它可以在指定的时间间隔内执行特定的任务。
当定时器启动时,它会创建一个新的线程,并在该线程中执行指定的任务。
定时器会在指定的时间间隔内不断地执行任务,直到定时器被取消或程序退出。
Java定时器的实现原理可以分为以下几个步骤:1. 创建一个Timer对象在Java中,要使用定时器,首先需要创建一个Timer对象。
Timer 对象是通过Timer类的构造函数来创建的。
在创建Timer对象时,可以指定定时器的名称、是否为守护线程、定时器的优先级等参数。
2. 创建一个TimerTask对象在Java中,要执行定时器任务,需要创建一个TimerTask对象。
TimerTask对象是通过继承TimerTask类来创建的。
在创建TimerTask对象时,需要实现run()方法,该方法中包含了要执行的任务。
3. 将TimerTask对象添加到Timer对象中在Java中,要执行定时器任务,需要将TimerTask对象添加到Timer对象中。
可以使用Timer对象的schedule()方法来添加TimerTask对象。
在添加TimerTask对象时,需要指定任务的执行时间和执行间隔。
4. 启动定时器在Java中,要启动定时器,需要调用Timer对象的start()方法。
启动定时器后,定时器会在指定的时间间隔内执行任务。
5. 取消定时器在Java中,要取消定时器,需要调用Timer对象的cancel()方法。
取消定时器后,定时器将停止执行任务。
总结Java定时器是一种非常常见的编程工具,它可以在指定的时间间隔内执行特定的任务。
java定时任务原理
Java定时任务原理一、概述在J av a开发中,定时任务是一种常见的需求。
通过设置定时任务,可以在指定的时间间隔或特定时间点执行特定的任务,从而提高系统的自动化程度。
本文将介绍J av a定时任务的原理及其相关知识。
二、J a v a中的定时任务J a va中有多种方式来实现定时任务,常见的包括Ti me r、S c he du le dE xe cu tor S er vi ce和Q ua rtz等。
这些方式本质上都是通过创建线程来完成任务的调度和执行。
三、T i m e r定时任务T i me r是Ja va提供的一种简单的定时任务调度器。
它通过创建一个后台线程来执行任务,可以设置任务的延迟时间和重复间隔。
然而,T i me r存在一些局限性,比如无法处理任务抛出的异常、无法灵活地处理任务的取消等。
四、S c h e d u l e d E x e c u t o r S e r v i c e定时任务S c he du le dE xe cu tor S er vi ce是J av a5引入的定时任务框架,它相比于Ti me r更为灵活和强大。
通过S che d ul ed Ex ec ut or Ser v ic e,我们可以创建延迟执行或周期性执行的任务。
它基于线程池的方式执行任务,能够更好地管理和控制任务的执行。
五、Q u a r t z定时任务Q u ar tz是一个功能强大而灵活的开源调度框架。
它提供了丰富的功能,可以执行复杂的任务调度需求。
Q ua rt z支持设置任务的触发器、监听器和任务链等特性,具有更好的可扩展性和灵活性。
六、定时任务的实现原理无论是T im er、S che d ul ed Ex ec ut or Ser v ic e还是Q ua rt z,它们的底层实现都是基于Ja v a的多线程机制。
在后台创建一个线程或线程池,不断地检查任务是否达到执行条件,一旦达到条件即可执行任务。
JAVA定时器JAVA定时器
定时器1、首先在导入Spring所有包的前提下还要导入一个定时器包:quartz-1.6.2.jar,然后在写一个要执行的任务类,如下:public class Prison {public Prison() {}public void execute() {List<Into_Prison> prisonlist = new ArrayList<Into_Prison>();prisonlist=into_prisonService.getAll();if(prisonlist.size()!=0 ){for(Into_Prison prison : prisonlist){if(Integer.parseInt(prison.getIp_Leftday())>0){ prison.setIp_Leftday(String.valueOf(Integer.parseInt(prison.getIp_Leftday() )-1));into_prisonService.save(prison);}else{prison.setIp_Leftday("0");into_prisonService.save(prison);}}}//System.out.println("=======执行了吗============");}private Into_PrisonService into_prisonService;public Into_PrisonService getInto_prisonService() {return into_prisonService;}public void setInto_prisonService(Into_PrisonService into_prisonService) {this.into_prisonService = into_prisonService;}}2、然后在Spring中的配置文件如下:<bean id="prison" class="com.prison.action.Prison"><property name="into_prisonService" ref="into_prisonService" /> </bean>以上配置为给任务类的注入<bean id="saveProjectJob"class="org.springframework.scheduling.qua rtz.MethodInvokingJobDetailFactoryBean"><property name="targetObject"><ref local="prison" /></property><property name="targetMethod"><value>execute</value></property></bean>指定任务类中执行的方法:execute,把任务类的注入给Spring.<bean id="timeTrigger"class="org.springframework.scheduling.quartz .CronTriggerBean"><property name="jobDetail"><ref local="saveProjectJob" /></property><property name="cronExpression"><value>59 59 23 * * ?</value></property></bean>设置定时器的时间,59 59 23 * * ?为在每天的23:59:59执行<bean id="scheduler"class="org.springframework.scheduling.quartz.S chedulerFactoryBean"><property name="triggers"><list><ref bean="timeTrigger"/></list></property></bean>执行定时器以上定时器主要完成的是把数据库里某个字段的数据过一天就减少一天。
java关于Timerschedule执行定时任务
java关于Timerschedule执⾏定时任务1、在应⽤开发中,经常需要⼀些周期性的操作,⽐如每5分钟执⾏某⼀操作等。
对于这样的操作最⽅便、⾼效的实现⽅式就是使⽤java.util.Timer⼯具类。
private java.util.Timer timer;timer = new Timer(true);timer.schedule(new java.util.TimerTask() { public void run() { //server.checkNewMail(); 要操作的⽅法 } }, 0, 5*60*1000);第⼀个参数是要操作的⽅法,第⼆个参数是要设定延迟的时间,第三个参数是周期的设定,每隔多长时间执⾏该操作。
使⽤这⼏⾏代码之后,Timer本⾝会每隔5分钟调⽤⼀遍server.checkNewMail()⽅法,不需要⾃⼰启动线程。
Timer本⾝也是多线程同步的,多个线程可以共⽤⼀个Timer,不需要外部的同步代码。
2、(1)Timer.schedule(TimerTask task,Date time)安排在制定的时间执⾏指定的任务。
(2)Timer.schedule(TimerTask task,Date firstTime ,long period)安排指定的任务在指定的时间开始进⾏重复的固定延迟执⾏.(3)Timer.schedule(TimerTask task,long delay)安排在指定延迟后执⾏指定的任务.(4)Timer.schedule(TimerTask task,long delay,long period)安排指定的任务从指定的延迟后开始进⾏重复的固定延迟执⾏.(5)Timer.scheduleAtFixedRate(TimerTask task,Date firstTime,long period)安排指定的任务在指定的时间开始进⾏重复的固定速率执⾏.(6)Timer.scheduleAtFixedRate(TimerTask task,long delay,long period)安排指定的任务在指定的延迟后开始进⾏重复的固定速率执⾏.以下内容根据 The JavaTM Tutorial 和相关API doc翻译整理,以供⽇后参考:1.概览Timer是⼀种定时器⼯具,⽤来在⼀个后台线程计划执⾏指定任务。
java定时任务实现原理
Java定时任务实现原理1. 什么是定时任务?在计算机编程中,定时任务是一种可以在事先设定的时间点或者时间间隔触发执行的任务。
定时任务常用于需要定期执行的后台任务,例如定时备份数据、定时生成报表、定时发送邮件等。
2. Java定时任务的实现方式在Java中,有多种方式可以实现定时任务,其中比较常用的有以下几种:•使用java.util.Timer和java.util.TimerTask类•使用java.util.concurrent.ScheduledExecutorService接口•使用Spring框架的@Scheduled注解接下来,我们将逐一介绍这些方式的实现原理。
3. 使用java.util.Timer和java.util.TimerTask类java.util.Timer和java.util.TimerTask是Java提供的两个用于实现定时任务的类。
Timer类用于调度一个TimerTask任务,在指定的时间点执行任务或按照固定的时间间隔执行任务。
TimerTask类是一个抽象类,需要继承并实现run()方法,该方法中定义了要执行的具体任务。
具体实现步骤如下:1.创建一个继承自TimerTask的子类,并重写run()方法,定义具体的任务逻辑。
2.创建一个Timer对象,用于调度任务。
3.调用Timer对象的schedule()方法,传入定时执行的时间点或时间间隔以及任务对象,用于指定任务的执行方式。
以下是一个使用Timer和TimerTask实现简单定时任务的例子:import java.util.Timer;import java.util.TimerTask;public class ScheduledTaskExample {public static void main(String[] args) {Timer timer = new Timer();timer.schedule(new MyTask(), 5000); // 在5秒后执行任务// 程序继续执行其他任务// ...}}class MyTask extends TimerTask {public void run() {System.out.println("定时任务执行中...");}}在上述例子中,我们创建了一个Timer对象,并使用schedule()方法在5秒后执行MyTask任务,MyTask任务会输出一行文本。
java 定时器 quartz 集群原理
java 定时器 quartz 集群原理Java定时器Quartz是一个开源的作业调度框架,提供了丰富的功能和灵活的配置选项。
它支持集群部署,可以在多个节点上同时运行,并保证作业的唯一性和可靠性。
本文将介绍Java定时器Quartz的集群原理。
一、Quartz集群简介Quartz集群由多个节点组成,每个节点都可以独立地执行作业调度任务。
节点之间通过数据库或其他共享存储来共享作业的调度信息,并通过心跳机制来检测节点的存活状态。
当一个节点失效时,其他节点会接管该节点的作业调度任务,确保作业的连续性和可用性。
二、Quartz集群配置1. 数据库配置:Quartz集群需要一个共享的数据库来存储作业的调度信息。
每个节点都需要连接到同一个数据库,并使用相同的表结构来保存调度信息。
2. 节点配置:每个节点都需要配置一个唯一的标识符,用于区分不同的节点。
节点之间的标识符应该是唯一的,并且不能重复。
3. 心跳配置:节点之间通过心跳机制来检测节点的存活状态。
可以通过配置心跳间隔时间来控制节点之间的通信频率。
4. 负载均衡配置:Quartz集群支持负载均衡,可以配置作业的负载均衡策略,确保作业在集群中均匀分布。
三、Quartz集群工作原理1. 节点注册:当一个节点启动时,它会向数据库注册自己的信息,包括节点的标识符、IP地址和端口号等。
其他节点可以通过数据库查询来获取节点列表。
2. 作业分配:当一个作业被调度时,Quartz集群会选择一个节点来执行该作业。
选择节点的策略可以是随机选择、轮询选择或根据负载情况选择等。
3. 作业执行:当一个节点执行作业时,它会先获取作业的调度信息,并根据调度信息来执行作业。
执行结果可以通过数据库记录,以便其他节点获取执行状态。
4. 心跳检测:每个节点都会定期发送心跳信号,以检测节点的存活状态。
如果一个节点在一定时间内没有发送心跳信号,其他节点会认为该节点已失效,并接管其作业调度任务。
5. 故障恢复:当一个节点失效时,其他节点会接管其作业调度任务,确保作业的连续性和可用性。
Java中定时任务的6种实现方式
Java中定时任务的6种实现⽅式⽬录1、线程等待实现2、JDK⾃带Timer实现2.1 核⼼⽅法2.2使⽤⽰例2.2.1指定延迟执⾏⼀次2.2.2固定间隔执⾏2.2.3固定速率执⾏2.3 schedule与scheduleAtFixedRate区别2.3.1schedule侧重保持间隔时间的稳定2.3.2scheduleAtFixedRate保持执⾏频率的稳定2.4 Timer的缺陷3、JDK⾃带ScheduledExecutorService3.1 scheduleAtFixedRate⽅法3.2 scheduleWithFixedDelay⽅法4、Quartz框架实现4.1 Quartz集成5、Spring Task5.1 fixedDelay和fixedRate的区别5.2 Spring Task的缺点6、分布式任务调度6.1 Quartz分布式6.2 轻量级神器XXL-Job6.3 其他框架7、⼩结前⾔:⼏乎在所有的项⽬中,定时任务的使⽤都是不可或缺的,如果使⽤不当甚⾄会造成资损。
还记得多年前在做⾦融系统时,出款业务是通过定时任务对外打款,当时由于银⾏接⼝处理能⼒有限,外加定时任务使⽤不当,导致发出⼤量重复出款请求。
还好在后⾯环节将交易卡在了系统内部,未发⽣资损。
所以,系统的学习⼀下定时任务,是⾮常有必要的。
这篇⽂章就带⼤家整体梳理学习⼀下Java领域中常见的⼏种定时任务实现。
1、线程等待实现先从最原始最简单的⽅式来讲解。
可以先创建⼀个thread,然后让它在while循环⾥⼀直运⾏着,通过sleep⽅法来达到定时任务的效果。
public class Task {public static void main(String[] args) {// run in a secondfinal long timeInterval = 1000;Runnable runnable = new Runnable() {@Overridepublic void run() {while (true) {System.out.println("Hello !!");try {Thread.sleep(timeInterval);} catch (InterruptedException e) {e.printStackTrace();}}}};Thread thread = new Thread(runnable);thread.start();}}这种⽅式简单直接,但是能够实现的功能有限,⽽且需要⾃⼰来实现。
Java Web定时器使用(转载)
这个类最终功能是每天某个时间点(如每晚22点)执行某一功能.首先介绍java定时器(java.util.Timer)有定时执行计划任务的功能,通过设定定时器的间隔时间,会自动在此间隔时间后执行预先安排好的任务(java.util. TimerTask)如: 每隔一个小时执行任务 timer.schedule(TimerTask, 0, 60 * 60 * 1000);schedule方法的第一个参数是需要执行的任务,此类的类型为java.util.TimerTask,第二个参数为执行任务前等待时间,此处0表示不等待,第三个参数为间隔时间,单位为毫秒由于我们希望当Web工程启动时,定时器能自动开始计时,这样在整个Web工程的生命期里,就会定时的执行任务,因此启动定时器的类不能是一般的类,此处用Servlet的监听器类来启动定时器,通过在配置文件里配置此监听器, 让其在工程启动时自动加载运行,存活期为整个Web工程生命期.要运用Servlet侦听器需要实现javax.servlet.ServletContextListener接口,以下是类设计:public class TimerListener implements ServletContextListener { private Timer timer = null;private SampleTask sampleTask;@Overridepublic void contextDestroyed(ServletContextEvent event) { timer.cancel();event.getServletContext().log("定时器销毁");}@Overridepublic void contextInitialized(ServletContextEvent event) { timer = new Timer(true);sampleTask = new SampleTask(event.getServletContext()); event.getServletContext().log("定时器已启动");timer.schedule(sampleTask, 0, 60 * 60 * 1000);event.getServletContext().log ("已经添加任务调度表");}}public class SampleTask extends TimerTask {private ServletContext context;private static boolean isRunning = false;private static boolean flag = true;private static final int C_SCHEDULE_HOUR = 15;public SampleTask(ServletContext context){this.context = context;}@Overridepublic void run() {Calendar cal = Calendar.getInstance();if (!isRunning) {if (C_SCHEDULE_HOUR == cal.get(Calendar.HOUR_OF_DAY) && flag) {isRunning = true;context.log("开始执行指定任务");//需要执行的代码isRunning = false;flag = false;context.log("指定任务执行结束");}} else {context.log("上一次任务执行还未结束");}if(C_SCHEDULE_HOUR != cal.get(Calendar.HOUR_OF_DAY)){flag = true;}}}要使用此监听器需要在web.xml中配置,如下:<listener><listener-class>包路径.TimerListener</listener-class></listener>这样在web工程启动时,就会自动启动此监听器.JAVA中Timer定时器调度方法java timer中的时间调度方法主要有:schedule(TimerTask task, Date firstTime, long period)Schedules the specified task for repeated fixed-delay execution, beginning at the specified time.但是如果此时的firstTime小于(时间落后于)当前时间,那么task会立即执行,在调试的时候不方便,因为程序一启动就开始执行了,或许还没有到任务的触发点。
java tomcat定时任务实现原理
java tomcat定时任务实现原理一、概述在Java Web开发中,我们经常会遇到需要定时执行某些任务的场景,比如定时清理缓存、定时统计数据等。
Tomcat作为一个常用的Java Web服务器,提供了一种简单而强大的方式来实现这些定时任务。
本文将详细介绍Tomcat定时任务的实现原理。
二、Tomcat定时任务的基本原理Tomcat利用了Java中的Timer和TimerTask来实现定时任务功能。
Timer是Java 提供的一个定时调度器,用于在指定的时间间隔执行任务。
TimerTask则是具体的任务实现类,需要继承它并重写run()方法,以定义具体的任务逻辑。
三、Tomcat定时任务的配置要在Tomcat中配置定时任务,我们需要在web.xml文件中添加以下内容:<listener><listener-class>com.example.MyContextListener</listener-class></listener>在这个例子中,我们将定时任务的逻辑封装在一个自定义的监听器MyContextListener中。
四、自定义监听器我们需要自定义一个监听器类来实现定时任务的逻辑。
以下是一个简单的示例:package com.example;import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;import java.util.Timer;import java.util.TimerTask;public class MyContextListener implements ServletContextListener {private Timer timer;@Overridepublic void contextInitialized(ServletContextEvent servletContextEvent) { // 在Servlet容器启动时执行定时任务timer = new Timer();// 指定定时任务的执行频率为每隔1分钟执行一次timer.schedule(new MyTask(), 0, 60 * 1000);}@Overridepublic void contextDestroyed(ServletContextEvent servletContextEvent) { // 在Servlet容器关闭时停止定时任务timer.cancel();}class MyTask extends TimerTask {@Overridepublic void run() {// 定时任务的具体逻辑System.out.println("定时任务执行了!");}}}在这个例子中,我们在contextInitialized()方法中创建了一个Timer实例,并使用schedule()方法指定了定时任务的执行频率。
纯java代码定时器的使用
//设置参数
JobDataMap map = myjob.getJobDataMap();
map.put("username", "赵六");
//定义触发器 触发器 有两种 一种 是间隔时间 就会发生 还有一个是 某个时间发生
// 这个触发器 第一个参数是 名称 第三个参数是 格式 就是 某个 时间出发
//设置 调度器开启后 多长时间 定时、
// 获取系统时间System.currentTimeMillis()
// mytrig.setStartTime(new Date(System.currentTimeMillis()+2000));
//定义调度工厂
SchedulerFactory factory = new StdSchedulerFactory();
“ L ”:表示最后一天,仅在日期和星期字段中使用
“ # ”:只能用于“星期几”字段,表示这个月的第几个周几。例如:“6#3”指这个月第三个周五
0 0 8-12 ? * MON-FRI 每个工作日的8点到12点
0 15 4 * * ? 每天凌晨4点15分
30 0 0 1 1 ? 2igger mytrig = new CronTrigger("myTrig", "mygroup", "50 45 21 * * ?");
//这两行的意思的 间隔时间会发生的
// SimpleTrigger mytrig = new SimpleTrigger("myTrig", SimpleTrigger.REPEAT_INDEFINITELY, 3000);
java中timer的用法
java中timer的用法java中的Timer类是一种基于定时任务的实现方式,它提供一种启动,停止,重新启动,以及设定延迟和间隔的方法。
由于其灵活性,Timer类可以用来创建一个定时器,用来执行我们想要定时执行的任务或动作,比如,我们可以使用Timer来在每天的某个时间点上运行一个程序,或者可以按照一定的间隔运行另一个程序。
Timer类是一个抽象类,不能直接实例化,但可以使用它的子类TimerTask来实例化,TimerTask是一个抽象类,用于实现定时任务,它的核心方法run()可以被覆写,在重写后的run方法中就可以放置要每次定时执行的任务。
要使用Timer类,通常只需要三步:第一步:实例化一个Timer对象。
第二步:实例化一个TimerTask对象,并将其传递给Timer对象。
TimerTask是一个抽象类,因此必须实现它的抽象方法run。
第三步:通过调用Timer对象的schedule()方法,将TimerTask计划到指定的时间,以及指定的间隔。
Timer类还提供了另外几种不同的schedule()方法,来控制TimerTask的执行时间,它们分别是:schedule(TimerTask task, long delay): 延迟指定的时间来执行某任务。
schedule(TimerTask task, Date time): 在指定的日期时间执行某任务。
schedule(TimerTask task, long delay, long period): 从指定的延迟时间开始,按指定的间隔时间重复执行某任务。
scheduleAtFixedRate(TimerTask task, long delay, long period): 从指定的延迟时间开始,按指定的间隔时间重复执行某任务,但是,如果上次任务执行没有完成,则只有等上次任务完成后再执行下一次任务。
Timer类还提供了一种cancel()方法,可以取消当前任务,如果任务已经执行完毕,则不做任何处理。
JAVA:定时器的三种方法(详细注解)
JAVA:定时器的三种⽅法(详细注解)在Java中为我们提供了Timer来实现定时任务,当然现在还有很多定时任务框架,⽐如说Spring、QuartZ、Linux Cron等等,⽽且性能也更加优越。
但是我们想要深⼊的学习就必须先从最简单的开始。
第⼀种:创建⼀个thread,然后让它在while循环⾥⼀直运⾏着,通过sleep⽅法来达到定时任务的效果,代码如下public class Task1 {public static void main(String[] args) {// run in a second// 每⼀秒钟执⾏⼀次final long timeInterval = 1000;Runnable runnable = new Runnable() {public void run() {while (true) {// ------- code for task to run// ------- 要运⾏的任务代码System.out.println("Hello, stranger");// ------- ends heretry {// sleep():同步延迟数据,并且会阻塞线程Thread.sleep(timeInterval);} catch (InterruptedException e) {e.printStackTrace();}}}};//创建定时器Thread thread = new Thread(runnable);//开始执⾏thread.start();}}第⼆种:启动和去取消任务时可以控制,可以指定你想要的delay(开始执⾏的等待时间)时间,在实现时,Timer类可以调度任务,TimerTask 则是通过在run()⽅法⾥实现具体任务。
Timer实例可以调度多任务,它是线程安全的。
当Timer的构造器被调⽤时,它创建了⼀个线程,这个线程可以⽤来调度任务。
javaTimer定时每天凌晨1点执行任务
javaTimer定时每天凌晨1点执⾏任务下⾯给⼤家介绍java Timer 定时每天凌晨1点执⾏任务,具体代码如下所⽰:import java.util.TimerTask;/*** 执⾏内容* @author admin_Hzw**/public class Task extends TimerTask {public void run() {System.out.println("我有⼀头⼩⽑驴!");}}import java.util.Calendar;import java.util.Date;import java.util.Timer;/*** 任务管理* @author admin_Hzw**/public class TimerManager {/*** @param args*/public static void main(String[] args) {new TimerManager();}//时间间隔(⼀天)private static final long PERIOD_DAY = 24 * 60 * 60 * 1000;public TimerManager() {Calendar calendar = Calendar.getInstance();calendar.set(Calendar.HOUR_OF_DAY, 1); //凌晨1点calendar.set(Calendar.MINUTE, 0);calendar.set(Calendar.SECOND, 0);Date date=calendar.getTime(); //第⼀次执⾏定时任务的时间//如果第⼀次执⾏定时任务的时间⼩于当前的时间//此时要在第⼀次执⾏定时任务的时间加⼀天,以便此任务在下个时间点执⾏。
如果不加⼀天,任务会⽴即执⾏。
if (date.before(new Date())) {date = this.addDay(date, 1);}Timer timer = new Timer();Task task = new Task();//安排指定的任务在指定的时间开始进⾏重复的固定延迟执⾏。
observable debouncetime java用法
observable debouncetime java用法DebounceTime在Java中的用法DebounceTime是一个用于限制方法调用频率的概念。
在Java中,debounce time可以通过不同的方式实现,例如使用定时器或者使用Reactive编程范式中的debounce操作符。
本文将介绍debounce time 的具体用法,并一步步回答关于debounce time在Java中的问题。
第一部分:什么是DebounceTime?DebounceTime是限制方法调用频率的概念。
在某些场景下,我们需要限制方法的调用频率以避免过于频繁的调用。
DebounceTime可以确保一个方法在调用后的一段时间内不会被重复调用,直到等待时间过去后,再次调用才会生效。
这样可以有效避免频繁调用对系统性能造成的影响。
第二部分:DebounceTime的用途DebounceTime可以在很多场景下发挥重要作用。
以下是一些常见的应用场景:1. 用户输入:在用户输入的情况下,我们可能希望延迟一定时间再对输入进行处理。
例如,当用户在搜索框中输入关键词时,我们希望在用户停止输入后才进行搜索操作,避免频繁的搜索请求。
2. 事件处理:在事件处理中,有时候我们需要延迟处理事件,以避免处理过多的事件。
例如,当用户拖动滑块时,我们可能希望在用户停止拖动后再进行后续处理,以避免频繁处理导致的性能问题。
3. 网络请求:在进行网络请求时,我们可能需要限制请求的频率,以避免发送过多的请求导致服务器过载。
DebounceTime可以用来限制请求的频率,确保在一段时间内只发送一个请求。
第三部分:DebounceTime的实现方式在Java中,我们可以使用不同的方式实现DebounceTime。
下面将介绍两种常见的实现方式。
1. 使用定时器:我们可以使用Java的定时器类(Timer)来实现DebounceTime。
具体步骤如下:- 创建一个定时器对象。
java定时器中任务的启动、停止、再启动
java定时器中任务的启动、停⽌、再启动package com.cvicse.ump.timer.service;import java.util.Date;import java.util.Timer;import com.cvicse.ump.timer.task.TimTaskTest;/*** 定时任务管理器* @author dyh**/public class TimerManager {/*** 单例模式*/private static TimerManager timerManager = null;private TimerManager(){}public static TimerManager getInstance(){if(timerManager == null){timerManager = new TimerManager();}return timerManager;}/*** 定时器*/private Timer timer = new Timer("homePageTimer");/*** 定时任务*/private TimTaskTest timerTask = null;/*** 启动定时任务*/public void startTimerTask(){timer.purge();if(timerTask==null){timerTask = new TimTaskTest();}timer.schedule(timerTask, new Date(), 5000);}/*** 定时任务取消*/public void stopTimerTask(){timerTask.cancel();timerTask = null;//如果不重新new,会报异常}}TimerTask类和Timer类的cancel()⽅法详解⽆论是TimerTask类还是Timer类,其cancel()⽅法都是为了清除任务队列中的任务。
java定时器线程池(ScheduledThreadPoolExecutor)的实现
java定时器线程池(ScheduledThreadPoolExecutor)的实现前⾔定时器线程池提供了定时执⾏任务的能⼒,即可以延迟执⾏,可以周期性执⾏。
但定时器线程池也还是线程池,最底层实现还是ThreadPoolExecutor,可以参考我的另外⼀篇⽂章多线程–精通ThreadPoolExecutor。
特点说明1.构造函数public ScheduledThreadPoolExecutor(int corePoolSize) {// 对于其他⼏个参数在ThreadPoolExecutor中都已经详细分析过了,所以这⾥,将不再展开// 这⾥我们可以看到调⽤基类中的⽅法时有个特殊的⼊参DelayedWorkQueue。
// 同时我们也可以发现这⾥并没有设置延迟时间、周期等参数⼊⼝。
// 所以定时执⾏的实现必然在DelayedWorkQueue这个对象中了。
super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,new DelayedWorkQueue());}2.DelayedWorkQueueDelayedWorkQueue是在ScheduledThreadPoolExecutor的⼀个内部类,实现了BlockingQueue接⼝⾥⾯存放任务队列的数组如下:private RunnableScheduledFuture<?>[] queue =new RunnableScheduledFuture<?>[INITIAL_CAPACITY];我们分析过ThreadPoolExecutor,它从任务队列中获取任务的⽅式为poll和take两种,所以看⼀下poll和take两个⽅法的源码,回顾⼀下,ThreadPoolExecutor它会调⽤poll或take⽅法,先poll,再take,只要其中⼀个接⼝有返回就⾏public RunnableScheduledFuture<?> poll() {final ReentrantLock lock = this.lock;lock.lock();try {RunnableScheduledFuture<?> first = queue[0];// 这⾥有个getDelay,这是关键点,获取执⾏延时时间// 但是如果我们有延时设置的话,这就返回空了,然后就会调⽤take⽅法if (first == null || first.getDelay(NANOSECONDS) > 0)return null;elsereturn finishPoll(first);} finally {lock.unlock();}}public RunnableScheduledFuture<?> take() throws InterruptedException {final ReentrantLock lock = this.lock;lock.lockInterruptibly();try {for (;;) {RunnableScheduledFuture<?> first = queue[0];if (first == null)available.await();else {// 获取延时时间long delay = first.getDelay(NANOSECONDS);if (delay <= 0)return finishPoll(first);first = null; // don't retain ref while waitingif (leader != null)available.await();else {Thread thisThread = Thread.currentThread();leader = thisThread;try {// 使⽤锁,执⾏延时等待。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
我将把 java.util.Timer 和 java.util.TimerTask 统称为Java 计时器框架,它们使程序员可以很容易地计划简单的任务(注意这些类也可用于 J2ME 中)。
在 Java 2 SDK, Standard Edition, Version 1.3 中引入这个框架之前,开发人员必须编写自己的调度程序,这需要花费很大精力来处理线程和复杂的Object.wait() 方法。
不过,Java 计时器框架没有足够的能力来满足许多应用程序的计划要求。
甚至一项需要在每天同一时间重复执行的任务,也不能直接使用 Timer 来计划,因为在夏令时开始和结束时会出现时间跳跃。
本文展示了一个通用的 Timer 和 TimerTask 计划框架,从而允许更灵活的计划任务。
这个框架非常简单――它包括两个类和一个接口――并且容易掌握。
如果您习惯于使用 Java 定时器框架,那么您应该可以很快地掌握这个计划框架(有关 Java 定时器框架的更多信息,请参阅参考资料)。
计划单次任务计划框架建立在 Java 定时器框架类的基础之上。
因此,在解释如何使用计划框架以及如何实现它之前,我们将首先看看如何用这些类进行计划。
想像一个煮蛋计时器,在数分钟之后(这时蛋煮好了)它会发出声音提醒您。
清单 1 中的代码构成了一个简单的煮蛋计时器的基本结构,它用 Java 语言编写:清单 1. EggTimer 类package org.tiling.scheduling.examples;import java.util.Timer;import java.util.TimerTask;public class EggTimer {private final Timer timer = new Timer();private final int minutes;public EggTimer(int minutes) {this.minutes = minutes;}public void start() {timer.schedule(new TimerTask() {public void run() {playSound();timer.cancel();}private void playSound() {System.out.println("Your egg is ready!");// Start a new thread to play a sound...}}, minutes * 60 * 1000);}public static void main(String[] args) {EggTimer eggTimer = new EggTimer(2);eggTimer.start();}import java.text.SimpleDateFormat;import java.util.Date;import org.tiling.scheduling.Scheduler;import org.tiling.scheduling.SchedulerTask;import org.tiling.scheduling.examples.iterators.DailyIterator; public class AlarmClock {private final Scheduler scheduler = new Scheduler();private final SimpleDateFormat dateFormat =new SimpleDateFormat("dd MMM yyyy HH:mm:ss.SSS");private final int hourOfDay, minute, second;public AlarmClock(int hourOfDay, int minute, int second) {this.hourOfDay = hourOfDay;this.minute = minute;this.second = second;}public void start() {scheduler.schedule(new SchedulerTask() {public void run() {soundAlarm();}private void soundAlarm() {System.out.println("Wake up! " +"It's " + dateFormat.format(new Date()));// Start a new thread to sound an alarm...}}, new DailyIterator(hourOfDay, minute, second));}public static void main(String[] args) {AlarmClock alarmClock = new AlarmClock(7, 0, 0);alarmClock.start();}}注意这段代码与煮蛋计时器应用程序非常相似。
AlarmClock 实例拥有一个Scheduler (而不是 Timer)实例,用于提供必要的计划。
启动后,这个闹钟对SchedulerTask (而不是 TimerTask)进行调度用以发出报警声。
这个闹钟不是计划一个任务在固定的延迟时间后执行,而是用 DailyIterator 类描述其计划。
在这里,它只是计划任务在每天上午 7:00 执行。
下面是一个正常运行情况下的输出:Wake up! It's 24 Aug 2003 07:00:00.023Wake up! It's 25 Aug 2003 07:00:00.001Wake up! It's 26 Aug 2003 07:00:00.058Wake up! It's 27 Aug 2003 07:00:00.015Wake up! It's 28 Aug 2003 07:00:00.002...DailyIterator 实现了 ScheduleIterator,这是一个将 SchedulerTask 的计划执行时间指定为一系列 java.util.Date 对象的接口。
然后 next() 方法按时间先后顺序迭代 Date 对象。
返回值 null 会使任务取消(即它再也不会运行)――这样的话,试图再次计划将会抛出一个异常。
清单 3 包含 ScheduleIterator 接口:清单 3. ScheduleIterator 接口package org.tiling.scheduling;import java.util.Date;public interface ScheduleIterator {public Date next();}DailyIterator 的 next() 方法返回表示每天同一时间(上午 7:00)的 Date 对象,如清单 4 所示。
所以,如果对新构建的 next() 类调用 next(),那么将会得到传递给构造函数的那个日期当天或者后面一天的 7:00 AM。
再次调用 next() 会返回后一天的 7:00 AM,如此重复。
为了实现这种行为,DailyIterator 使用了 java.util.Calendar 实例。
构造函数会在日历中加上一天,对日历的这种设置使得第一次调用 next() 会返回正确的 Date。
注意代码没有明确地提到夏令时修正,因为 Calendar 实现(在本例中是 GregorianCalendar)负责对此进行处理,所以不需要这样做。
清单 4. DailyIterator 类package org.tiling.scheduling.examples.iterators;import org.tiling.scheduling.ScheduleIterator;import java.util.Calendar;import java.util.Date;/*** A DailyIterator class returns a sequence of dates on subsequent days * representing the same time each day.*/public class DailyIterator implements ScheduleIterator {private final int hourOfDay, minute, second;private final Calendar calendar = Calendar.getInstance();public DailyIterator(int hourOfDay, int minute, int second) {this(hourOfDay, minute, second, new Date());}public DailyIterator(int hourOfDay, int minute, int second, Date date) {this.hourOfDay = hourOfDay;this.minute = minute;this.second = second;calendar.setTime(date);calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);calendar.set(Calendar.MINUTE, minute);calendar.set(Calendar.SECOND, second);calendar.set(LISECOND, 0);if (!calendar.getTime().before(date)) {calendar.add(Calendar.DATE, -1);}}public Date next() {calendar.add(Calendar.DATE, 1);return calendar.getTime();}import java.util.Date;import java.util.Timer;import java.util.TimerTask;public class Scheduler {class SchedulerTimerTask extends TimerTask {private SchedulerTask schedulerTask;private ScheduleIterator iterator;public SchedulerTimerTask(SchedulerTask schedulerTask,ScheduleIterator iterator) {this.schedulerTask = schedulerTask;this.iterator = iterator;}public void run() {schedulerTask.run();reschedule(schedulerTask, iterator);}}private final Timer timer = new Timer();public Scheduler() {}public void cancel() {timer.cancel();}public void schedule(SchedulerTask schedulerTask,ScheduleIterator iterator) {Date time = iterator.next();if (time == null) {schedulerTask.cancel();} else {synchronized(schedulerTask.lock) {if (schedulerTask.state != SchedulerTask.VIRGIN) { throw new IllegalStateException("Task alreadyscheduled " + "or cancelled");}schedulerTask.state = SchedulerTask.SCHEDULED;schedulerTask.timerTask =new SchedulerTimerTask(schedulerTask, iterator); timer.schedule(schedulerTask.timerTask, time);}}}private void reschedule(SchedulerTask schedulerTask,ScheduleIterator iterator) {Date time = iterator.next();if (time == null) {schedulerTask.cancel();} else {synchronized(schedulerTask.lock) {if (schedulerTask.state != SchedulerTask.CANCELLED) { schedulerTask.timerTask =new SchedulerTimerTask(schedulerTask, iterator);timer.schedule(schedulerTask.timerTask, time);}}}}}清单 6 显示了 SchedulerTask 类的源代码:清单 6. SchedulerTaskpackage org.tiling.scheduling;import java.util.TimerTask;public abstract class SchedulerTask implements Runnable {final Object lock = new Object();int state = VIRGIN;static final int VIRGIN = 0;static final int SCHEDULED = 1;static final int CANCELLED = 2;TimerTask timerTask;protected SchedulerTask() {}public abstract void run();public boolean cancel() {synchronized(lock) {if (timerTask != null) {timerTask.cancel();}boolean result = (state == SCHEDULED);state = CANCELLED;return result;}}public long scheduledExecutionTime() {synchronized(lock) {return timerTask == null ? 0 :timerTask.scheduledExecutionTime();}}}就像煮蛋计时器,Scheduler 的每一个实例都拥有 Timer 的一个实例,用于提供底层计划。