Java 定时器的五种实现方式

本文详细介绍了Java中实现定时任务的五种方式:线程方式、Timer和TimerTask、ScheduledExecutorService、使用Spring的@Scheduled注解,以及深入探讨了Quartz定时框架的配置和应用。通过实例代码展示了如何在Spring中配置和启动定时任务,并对Quartz的JobDetail、触发器和调度工厂进行了讲解。


线程方式

		public class Main{  
		    public static void main(String[] args) {  
		        Runnable runnable = new Runnable() {  
		            public void run() {  
		                while (true) {  
		                    System.out.println("执行任务...");  
		                    try {  
		                        Thread.sleep(1000);//任务间隔 1s
		                    } catch (InterruptedException e) {  
		                        e.printStackTrace();  
		                    }  
		                }  
		            }  
		        };  
		        Thread thread = new Thread(runnable);  
		        thread.start();  
		    }  
		}  

Timer 和 TimerTask

		public class Main{  
		    public static void main(String[] args) {
				TimerTask task = new TimerTask() {  
		            @Override  
		            public void run() {  
		                System.out.println("执行任务...");  
		            }  
		        };  
		        //schedule(TimerTask task, long delay, long period)
		        new Timer().schedule(task,0,1000);//创建 Timer 对象时,也是创建一个线程
		   }
		}

ScheduledExecutorService

		public class Main{  
		    public static void main(String[] args) {  
		        Runnable runnable = new Runnable() {  
		            public void run() {  
		            	System.out.println("执行任务...");  
		            }  
		        };  
		        ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor(); 
		        //scheduleAtFixedRate(Runnable command,long initialDelay,long period,TimeUnit unit)
		        service.scheduleAtFixedRate(runnable, 10, 1, TimeUnit.SECONDS);
		        /*
		        * 相比与 Timer 的schedule 方法:
		        * schedule方法:下一次执行时间相对于 上一次 实际执行完成的时间点 ,因此执行时间会不断延后
				* scheduleAtFixedRate方法:下一次执行时间相对于上一次开始的 时间点 ,因此执行时间不会延后,存在并发性
		        */
		    }  
		}  

@Scheduled注解

基于 Spring 框架,在配置文件中加入:

		<!-- 启用注解定时器 -->
		<task:annotation-driven />

在要实现定时的方法上加上注解:

		@Scheduled(cron = "0 0 * * * ? ")
	    public void task(){
		    System.out.println("执行任务...");
		}

注意:

  1. cron 表达式这里就不详细介绍,可以用:cron在线生成器
  2. 如果是专门写一个类来写定时方法,则该类需要加上 @Componet 注解,该类才会被 Spring 实例化并启动定时方法。

Quartz

Quartz 是一个框架,可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的日程序表。
1.添加依赖:

		<dependency>
		    <groupId>org.quartz-scheduler</groupId>
		    <artifactId>quartz</artifactId>
		    <version>2.2.2</version>
		</dependency>
		<dependency>
		    <groupId>org.springframework</groupId>
		    <artifactId>spring-context-support</artifactId>
		    <version>4.1.3.RELEASE</version>
		</dependency>

2.创建一个任务类:

		public class Task{
		    public void execute(){
		        System.out.println("执行任务...");
		    }
		}
		<bean id="Task" class="com.moke.base.Task"/>

3.在 Spring 中进行配置:
(1)配置 JobDetail

		<bean id="SpringQtzJobMethod" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
	        <!-- 注入要具体执行的任务的呢个bean -->
	        <property name="targetObject">
	            <ref bean="Task" />
	        </property>
	        <property name="targetMethod">  
	            <value>execute</value><!-- 要执行的方法名称 -->
	        </property>
	    </bean>

(2)配置调度触发器

		<bean id="cronTriggerFactoryBean" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean ">
	        <!-- 此处的jobDetial正是上面所配的bean -->
	        <property name="jobDetail" ref="SpringQtzJobMethod"></property>
	        <!-- cron表达式:每10秒执行一次 -->
	        <property name="cronExpression" value="0/10 * * * * ?"></property>
	    </bean>

(3)配置调度工厂:在list中可以配置多个调度触发器

		<bean id="SpringJobSchedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
	        <property name="triggers">
	            <list>
	                <ref bean="cronTriggerFactoryBean" />
	            </list>
	        </property>
	    </bean>
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值