Java任务调度

1.Timer

package com.qhong;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class Main {
    public static void main(String[] args) {
        Timer timer = new Timer();
        long delay1 = 1 * 1000;
        long period1 = 1000;
        // 从现在开始 1 秒钟之后,每隔 1 秒钟执行一次 job1
        timer.schedule(new TimerTest("job1" +DateUtils.format(new Date(),"yyyy-MM-dd HH:mm:ss")), delay1, period1);
        long delay2 = 2 * 1000;
        long period2 = 2000;
        // 从现在开始 2 秒钟之后,每隔 2 秒钟执行一次 job2
        timer.schedule(new TimerTest("job2"), delay2, period2);
    }
}

class TimerTest extends TimerTask {
    private String jobName = "";
    public TimerTest(String jobName) {
        super();
        this.jobName = jobName;
    }

    @Override
    public void run() {
        System.out.println("execute " + jobName);
    }
}

class DateUtils {
    /** 时间格式(yyyy-MM-dd) */
    public final static String DATE_PATTERN = "yyyy-MM-dd";
    /** 时间格式(yyyy-MM-dd HH:mm:ss) */
    public final static String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";

    public static String format(Date date) {
        return format(date, DATE_PATTERN);
    }

    public static String format(Date date, String pattern) {
        if(date != null){
            SimpleDateFormat df = new SimpleDateFormat(pattern);
            return df.format(date);
        }
        return null;
    }
}
execute job12017-03-10 19:48:45
execute job2
execute job12017-03-10 19:48:45
execute job12017-03-10 19:48:45
execute job2
execute job12017-03-10 19:48:45
execute job12017-03-10 19:48:45
execute job2
execute job12017-03-10 19:48:45
execute job12017-03-10 19:48:45
execute job2
execute job12017-03-10 19:48:45
execute job12017-03-10 19:48:45

Timer 的优点在于简单易用,但由于所有任务都是由同一个线程来调度,因此所有任务都是串行执行的,同一时间只能有一个任务在执行,前一个任务的延迟或异常都将会影响到之后的任务。

ScheduledExecutor

package com.qhong;

import java.util.Date;
import java.text.SimpleDateFormat;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class Main {
    public static void main(String[] args) {
        ScheduledExecutorService service = Executors.newScheduledThreadPool(10);

        long initialDelay1 = 1;
        long period1 = 1;
        // 从现在开始1秒钟之后,每隔1秒钟执行一次job1
        service.scheduleAtFixedRate(
                new ScheduledExecutorTest("job1"), initialDelay1,
                period1, TimeUnit.SECONDS);

        long initialDelay2 = 2;
        long delay2 = 2;
        // 从现在开始2秒钟之后,每隔2秒钟执行一次job2
        service.scheduleWithFixedDelay(
                new ScheduledExecutorTest("job2"), initialDelay2,
                delay2, TimeUnit.SECONDS);
    }
}

class ScheduledExecutorTest implements Runnable {
    private String jobName = "";

    public ScheduledExecutorTest(String jobName) {
        super();
        this.jobName = jobName;
    }

    @Override
    public void run() {
        System.out.println("execute "+ DateUtils.format(new Date(),"yyyy-MM-dd HH:mm:ss") + jobName);
    }
}

class DateUtils {
    /** 时间格式(yyyy-MM-dd) */
    public final static String DATE_PATTERN = "yyyy-MM-dd";
    /** 时间格式(yyyy-MM-dd HH:mm:ss) */
    public final static String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";

    public static String format(Date date) {
        return format(date, DATE_PATTERN);
    }

    public static String format(Date date, String pattern) {
        if(date != null){
            SimpleDateFormat df = new SimpleDateFormat(pattern);
            return df.format(date);
        }
        return null;
    }
}
execute 2017-03-10 20:03:53job1
execute 2017-03-10 20:03:54job2
execute 2017-03-10 20:03:54job1
execute 2017-03-10 20:03:55job1
execute 2017-03-10 20:03:56job1
execute 2017-03-10 20:03:56job2
execute 2017-03-10 20:03:57job1
execute 2017-03-10 20:03:58job1
execute 2017-03-10 20:03:58job2
execute 2017-03-10 20:03:59job1
execute 2017-03-10 20:04:00job1
execute 2017-03-10 20:04:00job2
execute 2017-03-10 20:04:01job1
execute 2017-03-10 20:04:02job1
execute 2017-03-10 20:04:02job2

展示了 ScheduledExecutorService 中两种最常用的调度方法 ScheduleAtFixedRate 和 ScheduleWithFixedDelay。

ScheduleAtFixedRate 每次执行时间为上一次任务开始起向后推一个时间间隔,即每次执行时间为 :initialDelay, initialDelay+period, initialDelay+2*period, …;

ScheduleWithFixedDelay 每次执行时间为上一次任务结束起向后推一个时间间隔,即每次执行时间为:initialDelay, initialDelay+executeTime+delay, initialDelay+2*executeTime+2*delay。

由此可见,ScheduleAtFixedRate 是基于固定时间间隔进行任务调度,ScheduleWithFixedDelay 取决于每次任务执行的时间长短,是基于不固定时间间隔进行任务调度。

https://www.ibm.com/developerworks/cn/java/j-lo-taskschedule/

时间: 2024-11-07 16:04:05

Java任务调度的相关文章

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

介绍: Quartz框架是一个全功能.开源的任务调度服务,可以集成几乎任何的java应用程序-从小的单片机系统到大型的电子商务系统.Quartz可以执行上千上万的任务调度. 核心概念 Quartz核心的概念:scheduler任务调度.Job任务.Trigger触发器.JobDetail任务细节 转自这篇文章对于Quartz定时器写的不错: http://blog.csdn.net/yuebinghaoyuan/article/details/9045471

Java任务调度开源框架quartz学习

一.quartz学习 Java框架介绍:Quartz从入门到进阶 http://edu.yesky.com/edupxpt/233/2209233.shtml 例子:http://javacrazyer.iteye.com/blog/675460 http://blog.csdn.net/lotusyangjun/article/details/6450421 官网:http://www.quartz-scheduler.org 二.ScheduledThreadPoolExecutor学习 J

java任务调度Timer简单例子

1.创建类TimerTest import java.util.Timer; import java.util.TimerTask; public class TimerTest { private final Timer timer = new Timer(); public void start() { timer.schedule(new TimerTask() { public void run() { System.out.println("定时任务"); } }, 0, 2

几种任务调度的 Java 实现方法与比较

几种任务调度的 Java 实现方法与比较 综观目前的 Web 应用,多数应用都具备任务调度的功能.本文由浅入深介绍了几种任务调度的 Java 实现方法,包括 Timer,Scheduler, Quartz 以及 JCron Tab,并对其优缺点进行比较,目的在于给需要开发任务调度的程序员提供有价值的参考. 前言 任务调度是指基于给定时间点,给定时间间隔或者给定执行次数自动执行任务.本文由浅入深介绍四种任务调度的 Java 实现: Timer ScheduledExecutor 开源工具包 Qua

几种任务调度的Java实现方法与比较

简介: 综观目前的 Web 应用,多数应用都具备任务调度的功能.本文由浅入深介绍了几种任务调度的 Java 实现方法,包括 Timer,Scheduler, Quartz 以及 JCron Tab,并对其优缺点进行比较,目的在于给需要开发任务调度的程序员提供有价值的参考. 任务调度是指基于给定时间点,给定时间间隔或者给定执行次数自动执行任务.本文由浅入深介绍四种任务调度的 Java 实现: Timer ScheduledExecutor 开源工具包 Quartz 开源工具包 JCronTab 此

几种任务调度的 Java 实现方法与比较--转载

前言 任务调度是指基于给定时间点,给定时间间隔或者给定执行次数自动执行任务.本文由浅入深介绍四种任务调度的 Java 实现: Timer ScheduledExecutor 开源工具包 Quartz 开源工具包 JCronTab 此外,为结合实现复杂的任务调度,本文还将介绍 Calendar 的一些使用方法. 回页首 Timer 相信大家都已经非常熟悉 java.util.Timer 了,它是最简单的一种实现任务调度的方法,下面给出一个具体的例子: 清单 1. 使用 Timer 进行任务调度 p

JAVA上百实例源码以及开源项目

简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级.中级.高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情.执着,对IT的憧憬.向往!此时此景,笔者只专注Android.Iphone等移动平台开发,看着这些源码心中有万分感慨,写此文章纪念那时那景! Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能.编辑音乐软件的朋友,这款实例会对你有所帮助.Calendar万年历 1个目标文件EJ

JCronTab 定时调用

习惯使用 unix/linux 的开发者应该对 crontab 都不陌生.Crontab 是一个很方便的用于 unix/linux 系统的任务调度命令.JCronTab 则是一款全然依照 crontab 语法编写的 java 任务调度工具. 首先简介一下 crontab 的语法,与上面介绍的 Quartz 很相似,但更加简洁 , 集中了最经常使用的语法.主要由六个字段组成(括弧中标识了每一个字段的取值范围): Minutes (0-59) Hours (0-23) Day-of-Month (1

Quartz学习总结

参考链接: 深入解读Quartz的原理:http://lavasoft.blog.51cto.com/62575/181907/ Java任务调度框架Quartz教程实例:http://blog.csdn.net/yuebinghaoyuan/article/details/9045471 最新quartz框架介绍:http://wenku.baidu.com/link?url=gSz5B1yZiD53xIsINzzhItRLu3SdoUnyBtITzmjswDS2p6IhUv8ps-AYak7