java定时任务
- 格式:docx
- 大小:30.16 KB
- 文档页数:8
Java定时器用法详解一、简介Java定时器(Timer)是Java编程语言中用于实现定时任务的一种工具。
它允许开发者在指定的时间间隔内执行特定的代码块,从而实现定时操作。
本文将详细介绍Java定时器的用法,包括创建定时器、设置任务、启动和停止定时器等内容。
二、创建定时器在Java中,要使用定时器,首先需要导入`java.util.Timer`类。
创建定时器的方法如下:import java.util.Timer;public class MyTimer {public static void main(String[] args) {Timer timer = new Timer();}}三、设置任务定时器的核心功能是执行定时任务,因此需要为定时器设置一个任务。
在Java 中,可以通过创建一个继承自`java.util.TimerTask`的类来实现定时任务。
以下是一个简单的示例:import java.util.TimerTask;class MyTask extends TimerTask {@Overridepublic void run() {System.out.println("定时任务执行");}}四、启动定时器创建好定时器和任务后,接下来需要启动定时器。
可以使用`schedule()`方法来设置定时器的任务和执行间隔。
以下是一个完整的示例:import java.util.Timer;import java.util.TimerTask;class MyTask extends TimerTask {@Overridepublic void run() {System.out.println("定时任务执行");}}public class MyTimer {public static void main(String[] args) {Timer timer = new Timer();MyTask task = new MyTask();timer.schedule(task, 0, 1000); // 立即执行,然后每隔1秒执行一次}}五、停止定时器在某些情况下,可能需要停止定时器的执行。
Java定时任务框架详细分析定时任务是开发中常见的需求之一,用于在指定的时间间隔内执行特定的任务。
为了方便管理和调度,Java开发社区提供了许多成熟的定时任务框架。
本文将详细分析几个主流的Java定时任务框架,包括Quartz、Spring Task和Elastic-Job。
一、Quartz定时任务框架Quartz是Java中最受欢迎的定时任务框架之一。
它提供了丰富的功能和灵活的配置选项,非常适合各种任务调度需求。
下面将对Quartz框架的核心概念和用法进行分析。
1.1 Job和Trigger在Quartz中,任务通过Job来表示,可以通过实现Job接口或继承Quartz提供的Job类来定义具体的任务逻辑。
Trigger用来触发任务的执行,可以设置任务的执行时间、频率和条件等。
1.2 调度器和调度器工厂Quartz的调度器(Scheduler)负责管理和执行任务,通过调度器工厂(SchedulerFactory)来创建和初始化调度器。
调度器可以配置多个触发器,每个触发器关联一个任务。
1.3 Quartz的核心功能Quartz提供了许多核心功能,包括任务持久化、错过任务处理、任务监听器、集群支持等。
任务持久化允许将任务信息存储在数据库中,可以在应用重启后继续执行未完成的任务。
错过任务处理则确保任务不会因为系统故障或应用不可用而丢失。
任务监听器可以监控任务的执行情况,并在任务状态发生变化时执行相应的操作。
集群支持则可以实现任务的负载均衡和高可用性。
二、Spring Task定时任务框架Spring Task是基于Spring框架的一个轻量级定时任务框架,它与Spring无缝集成,使用简单方便。
下面将对Spring Task框架的核心特性进行详细分析。
2.1 使用注解定义任务Spring Task允许使用注解方式定义定时任务,通过在方法上添加@Scheduled注解,可以指定任务的执行时间和频率。
任务方法可以是任意public方法,无需实现特定接口,方便灵活。
标题:深度探讨Java中的零点十分定时任务表达式一、引言在Java开发中,定时任务的使用频率非常高,而零点十分定时任务表达式更是常见的一种。
在本文中,我将从简单介绍零点十分定时任务表达式的基本概念开始,逐步深入探讨其用法、原理和注意事项,以帮助您更深入地理解和灵活运用这一常见的定时任务表达式。
二、什么是零点十分定时任务表达式?零点十分定时任务表达式是指一种用于在Java中进行定时任务调度的表达式格式。
在这种表达式中,我们可以指定小时、分钟、秒等时间单位,以便精确地控制定时任务的执行时间。
三、零点十分定时任务表达式的基本结构在Java中,零点十分定时任务表达式由6个字段组成,分别表示秒、分、时、日、月、周几。
其中,秒、分、时这三个字段用于表示时间,而日、月、周几这三个字段用于表示日期。
具体格式如下:秒(0-59)分(0-59)时(0-23)日(1-31)月(1-12)周几(0-7)其中,每个字段都可以设置为一个具体的值,多个值之间用逗号隔开;也可以使用“*”代表该字段的所有取值,使用“-”表示范围,使用“/”表示步长等。
以零点十分定时任务为例,要表示每天的零点十分执行一次任务的表达式为:```0 10 0 * * ?```四、零点十分定时任务表达式的高级用法除了基本的表示方式外,零点十分定时任务表达式还支持一些高级的用法,例如:- 使用“/”表示间隔时间。
“0 0/5 * * * ?”表示每隔5分钟执行一次任务。
- 使用“?”表示不指定具体的值。
在日、月、周几中,可以使用“?”来表示不指定具体的值,表示任意值都可以匹配。
五、零点十分定时任务表达式的注意事项在使用零点十分定时任务表达式时,需要注意以下几点:- 应谨慎设置秒、分、时,避免产生不必要的执行次数。
- 需要考虑定时任务的并发执行情况,避免出现多个任务同时执行的情况。
- 需要充分测试表达式的正确性和可靠性,在生产环境中谨慎调整定时任务的执行时间。
Java定时任务的三种实现⽅式前⾔现代的应⽤程序早已不是以前的那些由简单的增删改查拼凑⽽成的程序了,⾼复杂性早已是标配,⽽任务的定时调度与执⾏也是对程序的基本要求了。
很多业务需求的实现都离不开定时任务,例如,每⽉⼀号,移动将清空你上⽉未⽤完流量,重置套餐流量,以及备忘录提醒、闹钟等功能。
Java 系统中主要有三种⽅式来实现定时任务:Timer和TimerTaskScheduledExecutorService三⽅框架 Quartz下⾯我们⼀个个来看。
1> Timer和TimerTask先看⼀个⼩ demo,接着我们再来分析其中原理:这种⽅式的定时任务主要⽤到两个类,Timer 和 TimerTask。
其中,TimerTask 继承接⼝ Runnable,抽象的描述⼀种任务类型,我们只要重写实现它的 run ⽅法就可以实现⾃定义任务。
⽽ Timer 就是⽤于定时任务调度的核⼼类,demo 中我们调⽤其 schedule 并指定延时 1000 毫秒,所以上述代码会在⼀秒钟后完成打印操作,接着程序结束。
那么,使⽤上很简单,两个步骤即可,但是其中的实现逻辑是怎样的呢?Timer 接⼝⾸先,Timer 接⼝中,这两个字段是⾮常核⼼重要的:TaskQueue 是⼀个队列,内部由动态数组实现的最⼩堆结构,换句话说,它是⼀个优先级队列。
⽽优先级参考下⼀次执⾏时间,越快执⾏的越排在前⾯,这⼀点我们回头再研究。
接着,这个 TimerThread 类其实是 Timer 的⼀个内部类,它继承了 Thread 并重写了其 run ⽅法,该线程实例将在构建 Timer 实例的时候被启动。
run ⽅法内部会循环的从队列中取任务,如果没有就阻塞⾃⼰,⽽当我们成功的向队列中添加了定时任务,也会尝试唤醒该线程。
我们也来看⼀下 Timer 的构造⽅法:public Timer(String name) {thread.setName(name);thread.start();}再简单不过的构造函数了,为内部线程设置线程名,并启动该线程。
java中实现定时任务的常用方式,以及差异和注意事项。
1 Java中实现定时任务的常用方式在Java中,实现定时任务的方式很多,以下是目前比较常用的几种方式:1.1 Timer和TimerTaskTimer和TimerTask是Java中自带的定时任务实现方式。
Timer 是一个定时器类,支持在指定时间后执行任务,并且支持延迟和定时重复执行任务。
TimerTask则是一个实现了Runnable接口的抽象类,通过继承TimerTask并实现run()方法来定义具体的任务。
1.2 ScheduledExecutorServiceScheduledExecutorService是Java中提供的一种用于执行定时任务的线程池。
与Timer和TimerTask相比,ScheduledExecutorService的在线程安全性、定时任务的精度、定时任务的灵活性等方面有很大的改进。
ScheduledExecutorService支持延迟和定时重复执行任务,并且可以控制定时任务的执行周期、并发性等。
1.3 Spring中的@ScheduledSpring框架中提供了@Scheduled注解来支持定时任务的实现。
通过在指定的方法上加上@Scheduled注解,指定定时任务的执行周期和策略,就可以很方便地实现定时任务。
@Scheduled注解的实现依赖于ScheduledExecutorService。
1.4 Quartz框架Quartz是一个高效、灵活、可靠的开源定时任务调度框架,它提供了大量的功能和扩展点,并且可以与Spring等框架集成使用。
使用Quartz框架可以非常方便地实现复杂的定时任务逻辑,比如任务调度的优先级、任务的依赖关系、任务的失败重试等。
2. 差异与注意事项不同的定时任务实现方式在功能和特性上有差异,因此在选择合适的定时任务实现方式时需要考虑以下几点:2.1 精度和性能不同的定时任务实现方式在任务执行的精度和性能上有差异。
JAVA定时器的三种方法(详细注解)在Java中,有三种主要的定时器方法可以实现任务的定时执行。
这些方法包括Timer类、ScheduledThreadPoolExecutor类和TimerTask类。
下面将详细介绍这三种定时器方法的使用。
1. Timer类:Timer类是Java提供的一个基本的定时器类,可以用于在指定的时间间隔内执行指定的任务。
Timer类提供了schedule(和scheduleAtFixedRate(两个方法,用于按照指定的时间间隔执行任务。
(1)schedule(方法:该方法用于在指定的时间间隔后执行任务。
它的语法如下:public void schedule(TimerTask task, long delay)参数task表示要执行的任务,它是一个实现了TimerTask接口的类的实例。
参数delay表示延迟的时间,以毫秒为单位。
例如,下面的代码使用Timer类的schedule(方法,在延迟2秒后执行一个任务:```public void ruSystem.out.println("任务执行了");}},2000);```当运行上述代码后,程序将会输出"任务执行了"。
(2)scheduleAtFixedRate(方法:该方法用于以固定的时间间隔执行任务。
它的语法如下:public void scheduleAtFixedRate(TimerTask task, long delay, long period)参数task表示要执行的任务,它是一个实现了TimerTask接口的类的实例。
参数delay表示延迟的时间,以毫秒为单位。
参数period表示每次任务执行间隔的时间,也是以毫秒为单位。
例如,下面的代码使用Timer类的scheduleAtFixedRate(方法,延迟2秒后开始执行一个任务,并且每隔1秒执行一次:```public void ruSystem.out.println("任务执行了");}},2000,1000);```当运行上述代码后,程序将会输出"任务执行了",并且每隔1秒输出一次。
java定时任务表结构设计一、任务表的基本信息在设计任务表时,首先需要确定任务表的基本信息,包括任务ID、任务名称、任务描述等字段。
任务ID是唯一标识一个任务的字段,任务名称用于描述任务的名称,任务描述用于详细描述任务的功能和用途。
二、触发时间和执行周期定时任务的触发时间和执行周期是任务表中非常重要的字段。
触发时间表示任务的开始执行时间,可以是固定的日期和时间,也可以是每天、每周、每月的特定时间点。
执行周期表示任务的执行频率,可以是每天、每周、每月的特定时间间隔,也可以是固定的时间间隔。
在任务表中,可以使用两个字段来表示触发时间和执行周期。
触发时间字段可以使用日期时间类型,执行周期字段可以使用整数类型,表示时间间隔的单位可以是秒、分钟、小时、天等。
三、任务状态和执行结果任务状态和执行结果是任务表中用于记录任务执行状态和结果的字段。
任务状态可以是未执行、执行中、已完成等状态,用于标识任务的执行情况。
执行结果可以是成功、失败、部分成功等结果,用于记录任务的执行结果。
任务状态和执行结果可以使用字符类型的字段来表示,例如使用枚举类型或字符串类型来表示任务状态和执行结果。
四、其他相关字段除了基本信息、触发时间、执行周期、任务状态和执行结果外,还可以根据具体需求添加其他相关字段。
例如,可以添加任务的创建时间、修改时间等字段,用于记录任务的创建和修改时间。
五、索引和约束在设计任务表结构时,还需要考虑添加索引和约束来提高查询效率和数据完整性。
可以根据具体需求添加适当的索引,例如在触发时间字段上添加索引,以加快根据触发时间查询任务的速度。
同时,可以添加约束来限制字段的取值范围,例如任务名称字段的最大长度、任务状态字段的取值范围等。
六、总结设计一个符合要求的Java定时任务表结构需要考虑任务的基本信息、触发时间、执行周期、任务状态、执行结果等关键信息。
同时,还需要根据具体需求添加其他相关字段,并添加索引和约束来提高查询效率和数据完整性。
Java定时任务原理一、概述在J av a开发中,定时任务是一种常见的需求。
通过设置定时任务,可以在指定的时间间隔或特定时间点执行特定的任务,从而提高系统的自动化程度。
本文将介绍J av a定时任务的原理及其相关知识。
二、J a v a中的定时任务J a va中有多种方式来实现定时任务,常见的包括Ti me r、S c he du le dE xe cu tor S er vi ce和Q ua rtz等。
这些方式本质上都是通过创建线程来完成任务的调度和执行。
三、T i m e r定时任务T i me r是Ja va提供的一种简单的定时任务调度器。
它通过创建一个后台线程来执行任务,可以设置任务的延迟时间和重复间隔。
然而,T i me r存在一些局限性,比如无法处理任务抛出的异常、无法灵活地处理任务的取消等。
四、S c h e d u l e d E x e c u t o r S e r v i c e定时任务S c he du le dE xe cu tor S er vi ce是J av a5引入的定时任务框架,它相比于Ti me r更为灵活和强大。
通过S che d ul ed Ex ec ut or Ser v ic e,我们可以创建延迟执行或周期性执行的任务。
它基于线程池的方式执行任务,能够更好地管理和控制任务的执行。
五、Q u a r t z定时任务Q u ar tz是一个功能强大而灵活的开源调度框架。
它提供了丰富的功能,可以执行复杂的任务调度需求。
Q ua rt z支持设置任务的触发器、监听器和任务链等特性,具有更好的可扩展性和灵活性。
六、定时任务的实现原理无论是T im er、S che d ul ed Ex ec ut or Ser v ic e还是Q ua rt z,它们的底层实现都是基于Ja v a的多线程机制。
在后台创建一个线程或线程池,不断地检查任务是否达到执行条件,一旦达到条件即可执行任务。
Java应用开发中的批量处理和定时任务在Java应用开发中,批量处理和定时任务是非常常见和重要的功能需求。
批量处理指的是一次性处理大量数据或者执行重复性的任务,而定时任务则是指定一定的时间间隔或者具体的时间点来执行某些任务。
这两种功能的应用范围广泛,可以在后台数据处理、系统维护、数据导入导出等场景中发挥重要作用。
一、批量处理在应用开发中,经常需要对大量的数据进行处理,这时候就需要使用批量处理的方式来提高效率和性能。
批量处理一般包括以下几个步骤:1. 数据准备:批量处理的第一步是准备要处理的数据。
可以从数据库中查询得到需要处理的数据,也可以从文件中读取。
2. 数据处理:在数据准备完成后,接下来就是对数据进行处理。
根据实际的需求,可以进行各种操作,比如计算、过滤、转换、更新等。
3. 数据保存:数据处理完成后,需要将结果保存下来。
可以将处理后的数据存储到数据库中,也可以将结果输出到文件或者其他存储媒介中。
在Java中,使用批量处理功能可以借助于多线程、线程池或者并行计算框架来提高处理效率。
通过合理的设计和优化,可以有效地减少处理时间和系统资源消耗。
二、定时任务除了批量处理外,定时任务在应用开发中也有着广泛的应用。
定时任务可以在指定的时间间隔或者具体的时间点上执行某些任务,如定时数据库备份、定时数据同步、定时生成报表等。
在Java中,可以使用Timer类或者ScheduledExecutorService接口来实现定时任务的功能。
通过设置任务的执行时间和执行频率,可以灵活地控制任务的执行。
1. Timer类:Timer类是Java中用于实现定时任务的工具类。
通过Timer类,可以创建一个定时器,并且可以指定定时任务的执行时间和执行频率。
2. ScheduledExecutorService接口:ScheduledExecutorService接口是Java中用于实现定时任务的接口。
它是ExecutorService接口的子接口,提供了以固定频率或者固定延迟执行任务的功能。
java定时任务实现的4种⽅式⼩结1. java⾃带的TimerTimer timer = new Timer();timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println("Time's up!");}},3*1000,1000);2.ScheduledThreadPool-线程池ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(2);scheduledThreadPool.scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {System.out.println("=========================");}}, 1000, 2000, LISECONDS);scheduledThreadPool.scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {System.out.println(System.currentTimeMillis()+"<><>"+System.nanoTime());}}, 1000, 2000, LISECONDS);3.使⽤注解的形式:@Scheduled@Componentpublic class SpringScheduled {@Scheduled(initialDelay = 2000,fixedDelay = 5000)public void doSomething() {System.out.println("Spring⾃带的Scheduled执⾏了=======================");}}//下⾯是开启@SpringBootApplication@EnableSchedulingpublic class DemoApplication {public static void main(String[] args) throws InterruptedException {SpringApplication application = new SpringApplication(DemoApplication.class);application.addListeners(new ContextRefreshedEventListener());application.run(args);}}4.使⽤Quartz定时任务调度器配置@Configurationpublic class QuartzConfig {@Resourceprivate ScheduleTask scheduleTask;/*** 配置定时任务1* @return*/@Bean(name="firstJobDetail")public MethodInvokingJobDetailFactoryBean firstJobDetail(){MethodInvokingJobDetailFactoryBean method = new MethodInvokingJobDetailFactoryBean();// 为需要执⾏的实体类对应的对象method.setTargetObject(scheduleTask);// 需要执⾏的⽅法method.setTargetMethod("test");// 是否并发执⾏method.setConcurrent(false);return method;}/*** 配置触发器1* @param firstJobDetail* @return*/@Bean(name="firstTrigger")public SimpleTriggerFactoryBean firstTrigger(JobDetail firstJobDetail){SimpleTriggerFactoryBean simpleBean = new SimpleTriggerFactoryBean();simpleBean.setJobDetail(firstJobDetail);// 设置任务启动延迟simpleBean.setStartDelay(1000);// 每1秒执⾏⼀次simpleBean.setRepeatInterval(1000);//设置重复计数//simpleBean.setRepeatCount(0);return simpleBean;}/*** 配置Scheduler*/@Bean(name = "scheduler")public SchedulerFactoryBean schedulerFactoryBean(Trigger firstTrigger){SchedulerFactoryBean factoryBean = new SchedulerFactoryBean();factoryBean.setTriggers(firstTrigger);return factoryBean;}}要执⾏的任务@Componentpublic class ScheduleTask {public void test() {System.out.println("====================================");}}总结:还有其他⽅式可以实现定时任务的⽅式,可以贴出来,讨论讨补充知识:SpringBoot定时任务简单使⽤和⾃定义开启关闭修改周期⼀、简单使⽤1.pom加⼊基本springboot基本的starter即可<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional></dependency>2.@Scheduled 参数可以接受两种定时的设置,⼀种是我们常⽤的cron="*/6 * * * * ?",⼀种是 fixedRate = 6000,两种都表⽰每隔六秒打印⼀下内容。
Java定时任务的实现一、通过java本身提供的接口实现关键词:监听器(Listener)和定时器(Timer)任务(Task)。
方式:首先:建立一个监听器MyListenerimport java.util.Timer;import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;public class MyListener implements ServletContextListener {private Timer timer = null;public void contextInitialized(ServletContextEvent event) {timer = new Timer(true);//设置任务计划,启动和间隔时间timer.schedule(new MyTask(), 0, 86400000);}public void contextDestroyed(ServletContextEvent event) {timer.cancel();}}监听器web.xml配置<listener><listener-class>com.fastunit.samples.listener.MyListener</listener-class></listener>任务MyTaskimport java.util.TimerTask;public class MyTask extends TimerTask {// 继承TimerTaskpublic void run() {// 此处添加具体需要执行的任务代码}}上面的代码虽然简单实用,但是在web项目中的时候为了避免无法加载到的问题,在web项目中执行的时候只需要将代码写在servlet init()方法中或者struts中;二、使用Java中的定时器比较简单,其提供的任务也比较简单, 下面来看看使用quartz来执行一个复杂的任务.Task任务:package test.timerTask;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;import org.springframework.scheduling.quartz.QuartzJobBean;public class SayHelloTaskUsingQuartz extends QuartzJobBean{@Overrideprotected void executeInternal(JobExecutionContext context)throws JobExecutionException{//TODO Auto-generated method stubSystem.out.println("使用Quartz认为调度:Hello!!");}}Spring中配置:<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN""/dtd/spring-beans.dtd"><bean id="sayHelloJob"class="org.springframework.scheduling.quartz.JobDetailBean"><property name="jobClass"><value>test.timerTask.SayHelloTaskUsingQuartz</value></property></bean><!-- 关键在如下两个触发器的配置 --><!-- 类似于Java的简单触发器 --><bean id="helloTrigger"class="org.springframework.scheduling.quartz.SimpleTriggerBean"> <property name="jobDetail"><ref bean="sayHelloJob"/></property><property name="startDelay"><value>1000</value></property><property name="repeatInterval"><value>3000</value></property></bean><!-- 复杂触发器 --><bean id="helloCronTrigger"class="org.springframework.scheduling.quartz.CronTriggerBean "><property name="jobDetail"><ref bean="sayHelloJob"/></property><property name="cronExpression"><!-- 关键在配置此表达式 --><value>04915**</value></property></bean><bean id="scheduler"class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"><ref bean="helloCronTrigger"/></property></bean></beans>解释如下:Quartz设计者做了一个设计选择来从调度分离开作业。
Quartz中的触发器用来告诉调度程序作业什么时候触发。
框架提供了一把触发器类型,但两个最常用的是SimpleTrigger和CronTrigger。
SimpleTrigger为需要简单打火调度而设计。
典型地,如果你需要在给定的时间和重复次数或者两次打火之间等待的秒数打火一个作业,那么SimpleTrigger适合你。
另一方面,如果你有许多复杂的作业调度,那么或许需要 CronTrigger。
CronTrigger是基于Calendar-like调度的。
当你需要在除星期六和星期天外的每天上午10点半执行作业时,那么应该使用CronTrigger。
正如它的名字所暗示的那样,CronTrigger是基于Unix克隆表达式的。
作为一个例子,下面的Quartz克隆表达式将在星期一到星期五的每天上午10点15分执行一个作业。
0 15 10 * MON-FRI下面的表达式0 15 10 * 6L 2002-2005将在2002年到2005年的每个月的最后一个星期五上午10点15分执行作业。
你不可能用SimpleTrigger来做这些事情。
你可以用两者之中的任何一个,但哪个跟合适则取决于你的调度需要。
更多详细介绍参考此处:关于cronExpression的介绍:字段允许值允许的特殊字符秒0-59, - * /分0-59, - * /小时0-23, - * /日期1-31, - * / L W C月份1-12 或者 JAN-DEC, - * /星期1-7 或者 SUN-SAT, - * / L C #年(可选)留空, 1970-2099, - * /如上面的表达式所示:“*”字符被用来指定所有的值。
如:”*“在分钟的字段域里表示“每分钟”。
“-”字符被用来指定一个范围。
如:“10-12”在小时域意味着“10点、11点、12点”。
“,”字符被用来指定另外的值。
如:“MON,WED,FRI”在星期域里表示”星期一、星期三、星期五”.“?”字符只在日期域和星期域中使用。
它被用来指定“非明确的值”。
当你需要通过在这两个域中的一个来指定一些东西的时候,它是有用的。
看下面的例子你就会明白。
“L” 字符指定在月或者星期中的某天(最后一天)。
即“Last ”的缩写。
但是在星期和月中“L”表示不同的意思,如:在月子段中“L”指月份的最后一天-1月31日,2月28日,如果在星期字段中则简单的表示为“7”或者“SAT”。
如果在星期字段中在某个value值得后面,则表示“某月的最后一个星期value”,如“6L”表示某月的最后一个星期五。
“W”字符只能用在月份字段中,该字段指定了离指定日期最近的那个星期日。
“#”字符只能用在星期字段,该字段指定了第几个星期value在某月中表达式意义"0 0 12 * * ?"每天中午12点触发"0 15 10 ? * *"每天上午10:15触发"0 15 10 * * ?"每天上午10:15触发"0 15 10 * * ? *"每天上午10:15触发"0 15 10 * * ? 2005"2005年的每天上午10:15触发"0 * 14 * * ?"在每天下午2点到下午2:59期间的每1分钟触发"0 0/5 14 * * ?"在每天下午2点到下午2:55期间的每5分钟触发"0 0/5 14,18 * * ?"在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发"0 0-5 14 * * ?"在每天下午2点到下午2:05期间的每1分钟触发"0 10,44 14 ? 3 WED"每年三月的星期三的下午2:10和2:44触发"0 15 10 ? * MON-FRI"周一至周五的上午10:15触发"0 15 10 15 * ?"每月15日上午10:15触发"0 15 10 L * ?"每月最后一日的上午10:15触发"0 15 10 ? * 6L"每月的最后一个星期五上午10:15触发"0 15 10 ? * 6L2002-2005"2002年至2005年的每月的最后一个星期五上午10:15触发"0 15 10 ? * 6#3"每月的第三个星期五上午10:15触发每天早上6点0 6 * * *每两个小时0 */2 * * *晚上11点到早上8点之间每两个小时,早上八点0 23-7/2,8 * * *每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点0 11 4 * 1-31月1日早上4点0 4 1 1 *定时批处理作业是J2EE企业应用里很重要的一环,用来在晚间进行财务挂账,数据转存,新闻联播等等操作。