Java定时器和Quartz

一、前言

Quartz与原生的定时器之间的区别,不懂的请自行百度

二、自定义定时器

在学习一个框架之前,喜欢先想想我有没有能力实现一个简单的类似功能,定时器还是比较简单,可以一试。

/** * 自定义一个定时器 * @author lw */ public class MyTimer extends Thread{ private Long time ; public MyTimer(Long time) { this.time = time; } @Override public void run() { while(true){ try { Thread.sleep(time); } catch (InterruptedException e) { e.printStackTrace(); } send(); } } /** * 开始执行任务 */ public void execute(){ this.start(); } /** * 定时任务 */ private void send() { System.out.println("任务执行了:" + new Date()); } public static void main(String[] args) { MyTimer myTimer = new MyTimer(2000L) ; myTimer.execute(); } }

输出如:

任务执行了:Sat Apr 15 15:56:52 CST 2017 任务执行了:Sat Apr 15 15:56:54 CST 2017 任务执行了:Sat Apr 15 15:56:56 CST 2017 任务执行了:Sat Apr 15 15:56:58 CST 2017 任务执行了:Sat Apr 15 15:57:00 CST 2017

当然功能很简单,但是起码也学到了点东西。

三、Timer

要知道这么常用的功能,我都可以实现(比较菜的),Java肯定已经帮我们实现了,那就是Timer类了。

public class TimerTest { public static void main(String[] args) { Timer timer = new Timer(); // 5s后执行 // timer.schedule(new MyTask(), 5000); // 马上执行任务,每隔1000执行一次 timer.scheduleAtFixedRate(new MyTask(), new Date(), 1000); } } // 定时任务,这是一个线程 class MyTask extends TimerTask { @Override public void run() { System.out.println("task execute "); } }

扫描二维码关注公众号,回复: 4304942 查看本文章

查看TimerTask源码

public abstract class TimerTask implements Runnable { ... }

由上面可以知道,Timer也是基于线程来实现的。当然它实现的也更复杂点。

四、Quartz框架

Quartz是一个完全由Java编写的开源作业调度框架,为在Java应用程序中进行作业调度提供了简单却强大的机制。Quartz允许开发人员根据时间间隔来调度作业。它实现了作业和触发器的多对多的关系,还能把多个作业与不同的触发器关联。

使用如下:

创建job

public class HelloJob implements Job{ public void execute(JobExecutionContext context) throws JobExecutionException { JobDetail detail = context.getJobDetail(); String name = detail.getJobDataMap().getString("name"); System.out.println("say hello " + name ); } }

测试

public class QuartzTest { public static void main(String[] args) throws InterruptedException { // 创建工厂 SchedulerFactory schedulerfactory = new StdSchedulerFactory(); Scheduler scheduler = null; try { // 通过schedulerFactory获取一个调度器 scheduler = schedulerfactory.getScheduler(); // 指明job的名称,所在组的名称,以及绑定job类 JobDetail job = JobBuilder.newJob(HelloJob.class).withIdentity("JobName", "JobGroupName") .usingJobData("name", "quartz").build(); // 定义触发的条件 Trigger trigger = TriggerBuilder.newTrigger().withIdentity("CronTrigger1", "CronTriggerGroup") .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(3).repeatForever()) .startNow().build(); // 把作业和触发器注册到任务调度中 scheduler.scheduleJob(job, trigger); // 启动调度 scheduler.start(); Thread.sleep(10000); // 停止调度 scheduler.shutdown(); } catch (SchedulerException e) { e.printStackTrace(); } } }

步骤:

  1. 创建job
  2. 创建工厂,获取调度器
  3. 使用JobBuilder通过job生成jobDetail,可以传递数据
  4. 通过TriggerBuilder创建Trigger,可以设置时间
  5. 通过调度器注册ob和trigger
  6. 启动调度

五、Quartz和Spring整合

创建job

public class MailJob { private void send() { System.out.println("发送邮件了:" + new Date()); } }

配置

<description>Quartz配置文件</description> <!-- 定义一个job --> <bean id="mailJob" class="com.lw.jk.job.MailJob"></bean> <!-- 定义一个 MethodInvokingJobDetailFactoryBean--> <bean id="methodInvokingJobDetailFactoryBean" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="mailJob"></property> <property name="targetMethod" value="send"></property> </bean> <!-- 指定时间 --> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="methodInvokingJobDetailFactoryBean"></property> <property name="cronExpression" value="0/10 * * * * ? *"></property> </bean> <!-- 指定调度器 --> <bean id="schedule" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="cronTrigger"/> </list> </property> </bean>

  •  

输出如下:

发送邮件了:Sat Apr 15 16:12:00 CST 2017 发送邮件了:Sat Apr 15 16:12:10 CST 2017

OK,这篇学习定时器和Quart总结就这样了。

猜你喜欢

转载自blog.csdn.net/lsjinjin/article/details/84646468