Timer

Timer的核心是Timer和TimerTask,Timer负责设定TimerTask的起始与间隔执行时间,使用者需要建立一个timeTask的继承类,实现run方法,然后将其交给Timer使用即可。

Timer的设计是一个TaskList和一个TaskThread。Timer将接到的任务交给TaskList中,TaskList按照最初执行时间进行排序。TimerThread在创建Timer会成为一个守护线程。这个线程会轮询任务,找到一个最近要执行的任务,然后休眠,当到达最近要执行任务的开始时间点,TimerThread被唤醒并执行任务。之后Timer更新最近要执行的任务,继续休眠。

缺点:所有任务都是串行的,前一个任务的延迟或异常会影响到后面的任务。

demo:

 Timer timer = new Timer();
TimeTask task = new TimeTask(){
public void run(){
//具体业务
}
};
timer.scheduleAtFixedRate(task, new Date(), 1* 30 * 1000l);

ScheduledExecutor

java 5退出了ScheduledExecutor框架, 与timer不同的是,任务执行时是并发的,相互之间不受干扰,(保留意见,不一定非得是并发执行的就好),只有当任务执行时间到的时候,scheduedExecutor才会真正的执行线程,其余时间ScheduledExecutor都在轮询任务的状态。

 public class ScleduledExecutorTest implements Runnable{
private String jobName = "";
public ScheduledExecutorTest(String jobName){
super();
this.jobName = jobName;
}
public void run(){
System.out.println("execute " + jobName);
}
public static void main(String[] args){
ScheduledExecutorService service = Executors.newScheduledThreadPool(10);
service.scheduleAtFixRate(new ScheduledExecutorTest("job1"),1,1,TimeUnit.SECONDS);
service.scheduleWithFixedDelay(
new ScheduledExecutorTest("job2"), 1,
1, TimeUnit.SECONDS);
}
}

注意,能做定时执行的只能是newScheduledThreadPool 这个是专门做调度任务的,其他的线程池特性如下:

newSingleThreadExecutor:创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。

newFixedThreadPool:创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。

newCachedThreadPool:创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。

newScheduledThreadPool:创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。

newSingleThreadExecutor:创建一个单线程的线程池。此线程池支持定时以及周期性执行任务的需求。

并且线程池在停止的时候所用的shutdown与shutdownNow是不一样的,shutdown会继续执行并且完成所有未执行的任务,shutdownNow 会清楚所有未执行的任务并且在运行线程上调用interrupt() 。然而interrupt仅仅是在当前线程中打一个停止的标记。还需要加一个判断才能对线程的停止。

Thread.java提供了两个方法:

this.interrupted();

this.isInterrupted();

官方帮助文档对interrupted方法的解释是:

调用后,线程的中断状态被清除,也就是如果线程中断了,第一次返回true,第二次返回false。 并且这是一个静态方法。

isInterrupted不是一个静态方法,也不会清除中断状态。

中断线程通过标记判断,要么抛出异常,要么直接return。

ScheduledExecutor可以与Calendar实现更复杂的调度,比如制定每周的某个时间段执行。

也就是在执行线程中加上了Calandar的判断

Calendar ca = Calendar.getInstance();
int h = ca.get(Calendar.HOUR_OF_DAY);
int mi = h*60+ca.get(Calendar.MINUTE);
int ss = ca.get(Calendar.SECOND);

通过if进行判断,要注意,调度器的唤醒时间最好是各个线程激活的最大公约数。

Quartz

需要更精准的调度,需要使用Quartz框架了。

public static void main(String args[]){
UpdateJob.task(AutoJob.class,"0/1 * * * * ?" );
}
public class UpdateClientTimer {

    public static void task(Class cls, String expression) throws SchedulerException {

        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
long ctime = System.currentTimeMillis();
JobDetail jobDetail = new JobDetail("detail", "group", cls);
CronTrigger cronTrigger = new CronTrigger("cronTrigger", "group");
try {
CronExpression cexp = new CronExpression(expression);
cronTrigger.setCronExpression(cexp);
} catch (Exception e) {
e.printStackTrace();
}
scheduler.scheduleJob(jobDetail, cronTrigger);
scheduler.start();
}
}
调度周期是 "0/1 * * * * ?" 更精准的调度需要自行配置。
UpdateClientTimer 大体与官方文档相当。真正执行业务在本例的Autojob中。
public class AutoJob implements Job {
public void execute(JobExecutionContext arg0) throws JobExecutionException {
Calendar ca = Calendar.getInstance();
int h = ca.get(Calendar.HOUR_OF_DAY);
int mi = h*60+ca.get(Calendar.MINUTE);
int ss = ca.get(Calendar.SECOND); if(过滤条件){ } }

Quartz的核心类包括Scheduler,job以及Trigger。其中job负责定义需要执行的任务,trigger负责设置调度策略,Scheduler 将二者组装在一起。

有相关的官方说明文档,可以直接拿demo用。

 

java 任务调度实现的总结的更多相关文章

  1. 推荐几种Java任务调度的实现

    几种任务调度的 Java 实现方法与比较--转载 原文:http://www.ibm.com/developerworks/cn/java/j-lo-taskschedule/ 写了一天的作业调度,这 ...

  2. Java任务调度框架之分布式调度框架XXL-Job介绍

    ​ Java任务调度框架之分布式调度框架XXL-Job介绍及快速入门 调度器使用场景: Java开发中经常会使用到定时任务:比如每月1号凌晨生成上个月的账单.比如每天凌晨1点对上一天的数据进行对账操作 ...

  3. java任务调度quartz框架的小例子

    quartz是一个开源的作业调度框架,当然,java可以使用Timer来实现简单任务调度的功能,但Timer是单线程的设计方案,使得一个任务延迟会影响到其他的任务.java也可以使用Scheduled ...

  4. Java任务调度

    最近项目要用到任务调度的相关知识,昨天信心满满的去官网学习,结果被坑个半死,我用的最新版的quartz,文档里说是兼容所有版本,但是代码连编译都报错,无奈只好从网上找资料,摸着石头过河总算有点眉目,在 ...

  5. Java任务调度框架Quartz

    转自:http://blog.csdn.net/yuebinghaoyuan/article/details/9045471  介绍  Quartz is a full-featured, open ...

  6. Java任务调度框架Quartz入门

    Quartz[kwɔːts]:石英,其框架和名字一样简单朴素又不失魅力,在Java程序界,Quartz大名鼎鼎,很多Java应用几乎都集成或构建了一个定时任务调度系统,Quartz是一个定时任务调度框 ...

  7. (转)Java任务调度框架Quartz入门教程指南(三)任务调度框架Quartz实例详解深入理解Scheduler,Job,Trigger,JobDetail

    http://blog.csdn.net/zixiao217/article/details/53053598 首先给一个简明扼要的理解: Scheduler 调度程序-任务执行计划表,只有安排进执行 ...

  8. Java任务调度框架Quartz教程实例

    介绍: Quartz框架是一个全功能.开源的任务调度服务,可以集成几乎任何的java应用程序—从小的单片机系统到大型的电子商务系统.Quartz可以执行上千上万的任务调度.   核心概念   Quar ...

  9. java任务调度之Timer定时器

    定时器相信大家都不陌生,平时使用定时器就像使用闹钟一样,我们可以在固定的时间做某件事,也可以在固定的时间段重复做某件事,今天就来分析一下java中自带的定时任务器Timer. 一.Timer基本使用 ...

  10. Java任务调度框架Quartz教程

    一.什么是quartz作业调度? Quartz框架是一个全功能.开源的任务调度服务,可以集成几乎任何的java应用程序—从小的单片机系统到大型的电子商务系统.Quartz可以执行上千上万的任务调度. ...

随机推荐

  1. ztreeSearch

    $.fn.extend({ ztreeSearch : function(options) { // var _self=$(this); var defaults = { id : '', sear ...

  2. horizontalDragMaxWidth:0;就没有水平滚动条了

    jquery.jscrollpane.css JScrollPane工作所必须的基本的CSS样式.jquery.min.jsjQuery作为javascript库必须提前引入.jquery.mouse ...

  3. APNS的推送机制 3

    APNS的推送机制 首先我们看一下苹果官方给出的对iOS推送机制的解释.如下图 Provider就是我们自己程序的后台服务器,APNS是Apple Push Notification Service的 ...

  4. stm32DMA通道 ADC通道

    DMA: 1.使用DAC的时候.将转化后得到的模拟信号通过IO口输出的时候.为什么还将IO口配置能输入模式 PS:stm32手冊上定义PA4和PA5分别和DAC1通道和DAC2通道相连  : DMA1 ...

  5. JAVA中sleep() 和 wait() 有什么差别?

    (网上的答案:sleep是线程类(Thread)的方法,导致此线程暂停运行指定时间,将运行机会给其它线程.可是监控状态依旧保持,到时后会自己主动恢复.调用sleep不会释放对象锁. wait是Obje ...

  6. 爬虫入门【2】Requests库简介

    发送请求 使用Requests发送网络请求很简单 #首先要导入requests库 import requests #返回一个Response对象 r=requests.get('https://git ...

  7. php读写csv、xml文件: SimpleExcel

    实例结构: 1. csv2xml.demo.php <?php use SimpleExcel\SimpleExcel; // 这句不能少! require_once ('../lib/Simp ...

  8. JVM调优-工具篇

    原文地址 16年的时候花了一些时间整理了一些关于jvm的介绍文章,到现在回顾起来还是一些还没有补充全面,其中就包括如何利用工具来监控调优前后的性能变化.工具做为图形化界面来展示更能直观的发现问题,另一 ...

  9. UVALive - 7045 Last Defence 【数学】

    题目链接 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...

  10. iOS uitableViewCell 选中 push后返回 取消选中状态

    首先我有一个UITableViewController,其中每个UITableViewCell点击后都会push另一个 ViewController,每次点击Cell的时候,Cell都会被选中,当从p ...