一、Java普通自定义定时器

 /**
* 自定义一个定时器
* @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();
} }

输出内容:

 任务执行了:Tue Nov 13 10:10:02 CST 2018
任务执行了:Tue Nov 13 10:10:04 CST 2018
任务执行了:Tue Nov 13 10:10:06 CST 2018
任务执行了:Tue Nov 13 10:10:08 CST 2018
任务执行了:Tue Nov 13 10:10:10 CST 2018
任务执行了:Tue Nov 13 10:10:12 CST 2018
任务执行了:Tue Nov 13 10:10:14 CST 2018
任务执行了:Tue Nov 13 10:10:16 CST 2018
任务执行了:Tue Nov 13 10:10:18 CST 2018
任务执行了:Tue Nov 13 10:10:20 CST 2018

二、使用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 ");
}
}

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. 启动调度

四、Quarts 和 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

四、spring 自带的定时任务:spring-task

spring 自身的spring-task 不依赖任何的第三方框架,实现方式也很简单:

这里需要做的就是在xml文件中的引入task命名空间,以便后续标签中的使用:

xmlns:task="http://www.springframework.org/schema/task"
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.2.xsd

1:定义任务类:

 public class TaskJob {

     public void springJob(){
System.out.println("spring 自身的定时任务");
}
}

2:在xml配置文件中配置定时job:

1    <!--配置任务类-->
<bean id="beanA" class="bz.beppe.javase.TaskJob"></bean>
<!--定义触发类和触发方式-->
<task:scheduled-tasks scheduler="myScheduler">
<task:scheduled ref="beanA" method="springJob" fixed-rate="5000"/>
</task:scheduled-tasks> <task:scheduler id="myScheduler" pool-size="10"/>

经过这样的配置后在在开启这个定时任务的spring容器后就会开始相应的定时job。

Java定时器和Quartz使用的更多相关文章

  1. java定时器,Spring定时器和Quartz定时器

    一.java定时器的应用 其实java很早就有解决定时器任务的方法了,java提供了了类java.util.TimerTask类基于线程的方式来实现定时任务的操作,然后再提供java.util.Tim ...

  2. Java生鲜电商平台-定时器,定时任务quartz的设计与架构

    Java生鲜电商平台-定时器,定时任务quartz的设计与架构 说明:任何业务有时候需要系统在某个定点的时刻执行某些任务,比如:凌晨2点统计昨天的报表,早上6点抽取用户下单的佣金. 对于Java开源生 ...

  3. 实现quartz定时器及quartz定时器原理介绍(转)

    一.核心概念 Quartz的原理不是很复杂,只要搞明白几个概念,然后知道如何去启动和关闭一个调度程序即可.1.Job表示一个工作,要执行的具体内容.此接口中只有一个方法void execute(Job ...

  4. java定时器实现总结

    前言:Java定时器目前主要有3种实现方式:JDK组件,Spring Task,Quartz框架. 1. JDK组件(1) java.util.TimerTask MyTimerTask.java: ...

  5. 33、生鲜电商平台-定时器,定时任务quartz的设计与架构

    说明:任何业务有时候需要系统在某个定点的时刻执行某些任务,比如:凌晨2点统计昨天的报表,早上6点抽取用户下单的佣金. 对于Java开源生鲜电商平台而言,有定时推送客户备货,定时计算卖家今日的收益,定时 ...

  6. Java EE学习——Quartz的Cron表达式

    经历过低谷后,还是要好好学习,越失落会越来越落后. 今天写一下Cron表达式的用法,虽然是之前自己写的,也过了挺长一段时间,这次就拿出来作为回顾吧. Cron表达式是Quartz的精髓(个人觉得),比 ...

  7. java定时器和多线程实践记录

    这几天因为需要测试mongodb读写分离的问题,因此写了个定时查询程序,并且用到了多线程,以达到定时启动多个线程查询数据库的效果,下边代码记录备忘: package timmer; import ja ...

  8. [转][JAVA]定时任务之-Quartz使用篇

    [BAT][JAVA]定时任务之-Quartz使用篇 定时任务之-Quartz使用篇 Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与 ...

  9. Java定时器:Timer

    项目中往往会遇到需要定时的任务,例如订单,当用户在某个规定时间内没有操作订单时,订单状态将会发生改变. 那么在这种情况下,我们会用到定时器. 举例: import java.util.Timer; / ...

随机推荐

  1. Hbase导入MapReduce数据的时候提示Running Job XXXX后就一直卡着不动

    代码确信无误之后,ant运行起来,发现一执行就卡在Running Job XXXX那里一直不动了. 试着把代码打包成jar扔到Linux执行也还是一样的效果.还是停在那里.然后就一顿瞎蒙.最后发现是H ...

  2. 第三百一十八节,Django框架,信号

    第三百一十八节,Django框架,信号 Django中提供了“信号调度”,用于在框架执行操作时解耦.通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者. 也就是当程序有指定动作时, ...

  3. V4L2编程 视频采集-范例

    http://linuxtv.org/downloads/legacy/video4linux/API/V4L2_API/v4l2spec/: http://blog.csdn.net/kangear ...

  4. 学习:erlang开源项目。

    一.RabbitMQ:AMQP消息服务器 . 二.ejabberd是的Jabber / XMPP协议的即时通讯服务器. 三.cowboy/mochiweb.

  5. 反编译工具 jad

    JAD(Java Decompiler)是一个比较流行的Java反编译工具,可以从网站 http://www.varaneckas.com/jad/ 下载,有多个系统下的应用程序,包括Windows. ...

  6. Unity的加载路径

    1.Resources 路径 只读 不能动态的修改 存放内容 预制体(prefabs) - 不容易变化的预制体 prefabs打包的时候 会自动过滤不需要的资源 有利于减小资源大小 主线程加载 Res ...

  7. 详解MathType引用公式编号功能

    在论文创作期间,如果需要在文本中删除大量的公式,手动编号删除的工作量是比较大的,使用MathType引用公式编号功能就可以节约大量的时间,提供很大的方便.本教程将详解MathType引用公式编号功能. ...

  8. error C2065:!错误:未定义标识符“pBuf);”

    error C2065: “pBuf):”: 未声明的标识符 错误原因:第二个括号)使用的是中文符号!还有最后那个分号! 改回来就好了~ 原错误: 修正后错误消失:

  9. idea 新建项目 文件名都是红色的处理办法

    原因是当前的project用了版本控制器 所以这个project下面所有的项目都加入版本控制器里了,所以项目文件和名称都是红色的 简单文字叙述解决办法 file-->settings--> ...

  10. 使用tensorflow深度学习识别验证码

    除了传统的PIL包处理图片,然后用pytessert+OCR识别意外,还可以使用tessorflow训练来识别验证码. 此篇代码大部分是转载的,只改了很少地方. 代码是运行在linux环境,tesso ...