java代码定时,java定时任务

JAVA实现定时任务的几种方式

Java 基本的定时任务,总结方法有三种:

公司主营业务:网站制作、网站设计、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。成都创新互联公司是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。成都创新互联公司推出株洲免费做网站回馈大家。

1   创建一个thread,然后让它在while循环里一直运行着,通过sleep方法来达到定时任务的效果;

2   用Timer和TimerTask与第一种方法相比有如下好处:

当启动和去取消任务时可以控制

第一次执行任务时可以指定你想要的delay时间

3   用ScheduledExecutorService是从的java.util.concurrent里,做为并发工具类被引进的,这是最理想的定时任务实现方式,相比于上两个方法,它有以下好处:

相比于Timer的单线程,它是通过线程池的方式来执行任务的

可以很灵活的去设定第一次执行任务delay时间

提供了良好的约定,以便设定执行的时间间隔

java 怎么写定时任务

如果要执行一些简单的定时器任务,无须做复杂的控制,也无须保存状态,那么可以考虑使用JDK 入门级的定期器Timer来执行重复任务。

一、原理

JDK中,定时器任务的执行需要两个基本的类:

java.util.Timer;

java.util.TimerTask;

要运行一个定时任务,最基本的步骤如下:

1、建立一个要执行的任务TimerTask。

2、创建一个Timer实例,通过Timer提供的schedule()方法,将 TimerTask加入到定时器Timer中,同时设置执行的规则即可。

当程序执行了Timer初始化代码后,Timer定时任务就会按照设置去执行。

Timer中的schedule()方法是有多种重载格式的,以适应不同的情况。该方法的格式如下:

void schedule(TimerTask task, Date time)

安排在指定的时间执行指定的任务。

void schedule(TimerTask task, Date firstTime, long period)

安排指定的任务在指定的时间开始进行重复的固定延迟执行。

void schedule(TimerTask task, long delay)

安排在指定延迟后执行指定的任务。

void schedule(TimerTask task, long delay, long period)

安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。

Timer是线程安全的,此类可扩展到大量同时安排的任务(存在数千个都没有问题)。其所有构造方法都启动计时器线程。可以调用cancel() 终止此计时器,丢弃所有当前已安排的任务。purge()从此计时器的任务队列中移除所有已取消的任务。此类不提供实时保证:它使用 Object.wait(long) 方法来安排任务。

TimerTask是一个抽象类,由 Timer 安排为一次执行或重复执行的任务。它有一个抽象方法run()----计时器任务要执行的操作。因此,每个具体的任务类都必须继承TimerTask类,并且重写run()方法。另外它还有两个非抽象的方法:

boolean cancel()

取消此计时器任务。

long scheduledExecutionTime()

返回此任务最近实际 执行的安排 执行时间。

二、例子

下面用Timer实现一个简单例子:

package stu.timer;

import java.util.Date;

import java.util.TimerTask;

/**

* 重复执行的任务

*

* @author leizhimin,2008-10-9 9:20:20

*/

public class TestTimerTask extends TimerTask {

/**

* 此计时器任务要执行的操作。

*/

public void run() {

Date executeTime = new Date(this.scheduledExecutionTime());

System.out.println("本次任务执行的时间是" + executeTime);

}

}

package stu.timer;

import java.util.Timer;

import java.util.TimerTask;

/**

* 测试JDK Timer的执行

*

* @author leizhimin,2008-10-9 9:24:35

*/

public class TestTimer {

public static void main(String[] args) {

Timer timer = new Timer();

TimerTask task = new TestTimerTask();

timer.schedule(task, 500L, 1000L);

}

}

运行结果:

本次任务执行的时间是Thu Oct 09 09:47:57 CST 2008

本次任务执行的时间是Thu Oct 09 09:47:58 CST 2008

本次任务执行的时间是Thu Oct 09 09:47:59 CST 2008

本次任务执行的时间是Thu Oct 09 09:48:00 CST 2008

本次任务执行的时间是Thu Oct 09 09:48:01 CST 2008

本次任务执行的时间是Thu Oct 09 09:48:02 CST 2008

本次任务执行的时间是Thu Oct 09 09:48:03 CST 2008

本次任务执行的时间是Thu Oct 09 09:48:04 CST 2008

本次任务执行的时间是Thu Oct 09 09:48:05 CST 2008

......

java 定时任务的几种实现方式

JDK 自带的定时器实现

// schedule(TimerTask task, long delay) 延迟 delay 毫秒 执行

// schedule(TimerTask task, Date time) 特定时间执行

public static void main(String[] args) {

for (int i = 0; i 10; ++i) {

new Timer("timer - " + i).schedule(new TimerTask() {

@Override

public void run() {

println(Thread.currentThread().getName() + " run ");

}

}, 1000);

}

}

2. Quartz 定时器实现

//首先我们需要定义一个任务类,比如为MyJob02 ,

//该类需要继承Job类,然后添加execute(JobExecutionContext context)方法,在

//这个方法中就是我们具体的任务执行的地方。

//由希望由调度程序执行的组件实现的接口

public class MyJob02 implements Job {

@Override

public void execute(JobExecutionContext context) throws JobExecutionException {

// TODO Auto-generated method stub

// 执行响应的任务.

System.out.println("HelloJob.execute,"+new Date());

}

}

public class QuartzTest5 {

public static void main(String[] args) throws Exception {

//SchedulerFactory 是一个接口,用于Scheduler的创建和管理

SchedulerFactory factory = new StdSchedulerFactory();

//从工厂里面拿到一个scheduler实例

//计划表(可能翻译的不太贴切),现在我们有了要做的内容,

//与调度程序交互的主要API

/*

* Scheduler的生命期,从SchedulerFactory创建它时开始,

到Scheduler调用shutdown()方法时结束;Scheduler被创建后,

可以增加、删除和列举Job和Trigger,以及执行其它与调度相关的操作

(如暂停Trigger)。但是,Scheduler只有在调用start()方法后,

才会真正地触发trigger(即执行job)

*/

Scheduler scheduler = factory.getScheduler();

//具体任务.

//用于定义作业的实例

//JobBuilder - 用于定义/构建JobDetail实例,用于定义作业的实例。

JobDetail job = JobBuilder.newJob(MyJob.class).withIdentity("job1", "group1").build();

//Trigger(即触发器) - 定义执行给定作业的计划的组件

//TriggerBuilder - 用于定义/构建触发器实例

CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")

.withSchedule(CronScheduleBuilder.cronSchedule("0/1  * * * * ?")).build();

scheduler.scheduleJob(job, trigger);

scheduler.start();

}

3. Spring  boot 任务调度(这个非常容易实现)

/*

*  开启对定时任务的支持

*  在相应的方法上添加@Scheduled声明需要执行的定时任务。

*/

@EnableScheduling

//@EnableScheduling注解来开启对计划任务的支持

public class Application {

public static void main(String[] args) {

SpringApplication.run(Application.class, args);

}

}

@Component

public class ScheduledTasks {

private Logger logger = LoggerFactory.getLogger(ScheduledTasks.class);

private    int     i=0;

//0 0 0 2 * ?

@Scheduled(cron="*  *  *  2  *  ?")

//@Scheduled 注解用于标注这个方法是一个定时任务的方法

public void testFixDelay() {

logger.info("执行方法"+i++);

}

在Java中如何设置一个定时任务的代码应该怎么写?

指定定时任务的代码如下:

public void schedule(TimerTask task,Date time)

比如,我们希望定时任务2006年7月2日0时0分执行,只要给第二个参数传一个时间设置为2006年7月2日0时0分的Date对象就可以了.

有一种情况是,可能我们的程序启动的时候,已经是2006年7月3日了,这样的话,程序一启动,定时任务就开始执行了.

schedule最后一个重载的方法是

public void schedule(TimerTask task,Date firstTime,long period)

既然号称是定时任务,我们肯定希望由我们来指定任务指定的时间,显然上面的方法就不中用了,因为我们不知道程序什么时间开始运行,就没办法确定需要延时多少.没关系,schedule四个重载的方法还没用完呢.用下面这个就OK了。

java的几种定时任务

java定时任务有三种:

- JDK自带 :JDK自带的Timer以及JDK1.5+ 新增的ScheduledExecutorService;

- Quartz    :简单却强大的JAVA作业调度框架

- Spring3.0以后自带的task :可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多;

代码参考:

JDK 自带的定时器实现

schedule(TimerTask task, Date time) 特定时间执行

public static void main(String[] args) {

for (int i = 0; i 10; ++i) {

new Timer("timer - " + i).schedule(new TimerTask() {

@Override

public void run() {

println(Thread.currentThread().getName() + " run ");

}

}, new Date(System.currentTimeMillis() + 2000));

}

}

Quartz 定时器实现

2.1  通过maven引入依赖(这里主要介绍2.3.0)  注意:shiro-scheduler中依赖的是1.x版本  如果同时使用会冲突

!-- --

dependency

groupIdorg.quartz-scheduler/groupId

artifactIdquartz/artifactId

version2.3.0/version

/dependency

2.2 创建Job类

public class TestJob implements Job{

@Override

public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {

println(Thread.currentThread().getName() + " test job begin " + DateUtil.getCurrentTimeStr());

}

}

2.3 调度任务

public static void main(String[] args) throws InterruptedException, SchedulerException {

Scheduler scheduler = new StdSchedulerFactory().getScheduler();

// 开始

scheduler.start();

// job 唯一标识 test.test-1

JobKey jobKey = new JobKey("test" , "test-1");

JobDetail jobDetail = JobBuilder.newJob(TestJob.class).withIdentity(jobKey).build();

Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("test" , "test")

// 延迟一秒执行

.startAt(new Date(System.currentTimeMillis() + 1000))

// 每隔一秒执行 并一直重复

.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).repeatForever())

.build();

scheduler.scheduleJob(jobDetail , trigger);

Thread.sleep(5000);

// 删除job

scheduler.deleteJob(jobKey);

}

3.Spring 相关的任务调度

3.1 配置文件实现

spring-schedule.xml

task:scheduler id="myScheduler" pool-size="10" /

task:scheduled-tasks scheduler="myScheduler"

task:scheduled ref="job" method="test" cron="0 * * * * ?"/

/task:scheduled-tasks

3.2注解实现

spring-schedule.xml

task:scheduler id="myScheduler" pool-size="10" /

// 启用注解

task:annotation-driven scheduler="myScheduler"/

@Component 

public class Task{    

@Scheduled(cron="0/5 * *  * * ? ")   //每5秒执行一次

public void execute(){  

DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  

System.out.println(sdf.format(DateTime.now().toDate())+"*********B任务每5秒执行一次进入测试");    

}     

}

如何编写一个定时调度java程序

目前有两种流行Spring定时器配置:Java的Timer类和OpenSymphony的Quartz。

1.Java Timer定时

首先继承java.util.TimerTask类实现run方法

import java.util.TimerTask;

public class EmailReportTask extends TimerTask{

@Override

public void run() {

...

}

}

在Spring定义

...

配置Spring定时器

bean id="scheduleReportTask" class="org.springframework.scheduling.timer.ScheduledTimerTask"

property name="timerTask" ref="reportTimerTask" /

property name="period"

value86400000value

property

bean

timerTask属性告诉ScheduledTimerTask运行哪个。86400000代表24个小时

启动Spring定时器

Spring的TimerFactoryBean负责启动定时任务

bean class="org.springframework.scheduling.timer.TimerFactoryBean"

property name="scheduledTimerTasks"

listref bean="scheduleReportTask"/list

property

bean

scheduledTimerTasks里显示一个需要启动的定时器任务的列表。

可以通过设置delay属性延迟启动

bean id="scheduleReportTask" class="org.springframework.scheduling.timer.ScheduledTimerTask"

property name="timerTask" ref="reportTimerTask" /

property name="period"

value86400000value

property

property name="delay"

value3600000value

property

bean

这个任务我们只能规定每隔24小时运行一次,无法精确到某时启动

2.Quartz定时器

首先继承QuartzJobBean类实现executeInternal方法

import org.quartz.JobExecutionContext;

import org.quartz.JobExecutionException;

import org.springframework.scheduling.quartz.QuartzJobBean;

public class EmailReportJob extends QuartzJobBean{

protected void executeInternal(JobExecutionContext arg0)

throws JobExecutionException {

...

}

}

在Spring中定义

bean id="reportJob" class="org.springframework.scheduling.quartz.JobDetailBean"

property name="jobClass"

valueEmailReportJobvalue

property

property name="jobDataAsMap"

map

entry key="courseService"

ref bean="courseService"/

entry

map

property

bean

在这里我们并没有直接声明一个EmailReportJob Bean,而是声明了一个JobDetailBean。这个是Quartz的特点。JobDetailBean是Quartz的org.quartz.JobDetail的子类,它要求通过jobClass属性来设置一个Job对象。

使用Quartz的JobDetail中的另一个特别之处是EmailReportJob的courseService属性是间接设置的。JobDetail的jobDataAsMap属性接受一个Map,包括设置给jobClass的各种属性,当。JobDetailBean实例化时,它会将courseService Bean注入到EmailReportJob 的courseService 属性中。

启动定时器

Quartz的org.quartz.Trigger类描述了何时及以怎样的频度运行一个Quartz工作。Spring提供了两个触发器SimpleTriggerBean和CronTriggerBean。

SimpleTriggerBean与scheduledTimerTasks类似。指定工作的执行频度,模仿scheduledTimerTasks配置 .

bean id="simpleReportTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"

property name="jobDetail" ref="reprotJob" /

property name="startDelay"

value360000value

property

property name="repeatInterval"

value86400000value

property

bean

startDelay也是延迟1个小时启动

CronTriggerBean指定工作的准确运行时间

bean id="cronReportTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"

property name="jobDetail" ref="reprotJob" /

property name="cronExpression"

value0 0 6 * * ?value

property

bean

属性cronExpression告诉何时触发。最神秘就是cron表达式:

Linux系统的计划任务通常有cron来承担。一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素。从左到右:

1.秒2.分3.小时4.月份中的日期(1-31)5.月份(1-12或JAN-DEC)6.星期中的日期(1-7或SUN-SAT)7.年份(1970-2099)

每个元素都显示的规定一个值(如6),一个区间(9-12),一个列表(9,11,13)或一个通配符(*)。因为4和6这两个元素是互斥的,因此应该通过设置一个问号(?)来表明不想设置的那个字段,“/”如果值组合就表示重复次数(10/6表示每10秒重复6次)。

启动定时器

bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"

property name="triggers"

listref bean="cronReportTrigger"/list

property

bean

triggers属性接受一组触发器。


本文名称:java代码定时,java定时任务
文章分享:http://hbruida.cn/article/hosdpd.html