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. Pexpect--example--hive.py解读

    python version 2.6.6 ; pexpect 2.3 login方法解读: def login (args, cli_username=None, cli_password=None) ...

  2. iptables启动脚本分析

    #!/bin/sh # # iptables Start iptables firewall # # chkconfig: 2345 08 92 # description: Starts, stop ...

  3. history命令使用方法详解

    history是一条非常实用的shell命令,可以显示出之前在shell中运行的命令,配合last显示之前登录的用户,就可以追溯是哪个用户执行了某些命令.以下详细说明history使用中常见的命令或技 ...

  4. linux下nginx安装php

    把php安装包上传到linux的/usr/local/src 1.解压 cd /usr/local/src tar zxvf php-5.6.9.tar.gz cd php-5.6.9 2.编译安装 ...

  5. 初识Modbus TCP/IP-------------C#编写Modbus TCP客户端程序(二)

    由于感觉上一次写的篇幅过长,所以新开一贴,继续介绍Modbus TCP/IP的初步认识, 书接上回 3).03(0x03)功能码--------读保持寄存器 请求与响应格式 这是一个请求读寄存器108 ...

  6. 【BZOJ3333】排队计划 树状数组+线段树

    [BZOJ3333]排队计划 Description Input Output Sample Input 6 2 160 163 164 161 167 160 2 3 Sample Output 6 ...

  7. OLTP和OLAP

    1 OLTP和OLAP online transaction processing,联机事务处理.业务类系统主要供基层人员使用,进行一线业务操作,通常被称为联机事务处理. online analyti ...

  8. python login form

    import time from selenium import webdriver browser = webdriver.Chrome() wait_time = 1 USER = 'xl.fen ...

  9. c++操作flash

    c++操作falsh,忘了原文在哪了,自己尝试了,直接贴代码 // SDK版本 //////////////////////////////////////////////////////////// ...

  10. Js数组的map,filter,reduce,every,some方法

    var arr=[1,2,3,4,5,6]; res = arr.map(function(x){return x*x}) [1, 4, 9, 16, 25, 36] res = arr.filter ...