java定时器的几种实现方式以及配置参数的说明

电子常识

2640人已加入

描述

Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。

Java具有简单性、面向对象、分布式、健壮性、安全性、平***立与可移植性、多线程、动态性等特点。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。

JDK 自带的定时器实现

Timer类

这个类允许你调度一个java.util.TimerTask任务。主要有以下几个方法:

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

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);

}

}

out :

timer - 2 run

timer - 1 run

timer - 0 run

timer - 3 run

timer - 9 run

timer - 4 run

timer - 8 run

timer - 5 run

timer - 6 run

timer - 7 run
 

2. 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));

}

}

out:

timer - 0 run

timer - 7 run

timer - 6 run

timer - 8 run

timer - 3 run

timer - 5 run

timer - 2 run

timer - 1 run

timer - 4 run

timer - 9 run
 

3. schedule(TimerTask task, long delay, long period) 延迟 delay 执行并每隔period 执行一次

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 ”);

}

}, 2000 , 3000);

}

}

out:

timer - 0 run

timer - 5 run

timer - 4 run

timer - 8 run

timer - 3 run

timer - 2 run

timer - 1 run

timer - 7 run

timer - 9 run

timer - 6 run

timer - 3 run

timer - 7 run

timer - 5 run

timer - 4 run

timer - 8 run

ScheduledExecutorService 接口实现类

ScheduledExecutorService 是JAVA 1.5 后新增的定时任务接口,主要有以下几个方法。

- ScheduledFuture《?》 schedule(Runnable command,long delay, TimeUnit unit);

- 《V》 ScheduledFuture《V》 schedule(Callable《V》 callable,long delay, TimeUnit unit);

- ScheduledFuture《?》 scheduleAtFixedRate(Runnable command,long initialDelay,long period,TimeUnitunit);

- ScheduledFuture《?》 scheduleWithFixedDelay(Runnable command,long initialDelay,long delay,TimeUnitunit);1234

默认实现为ScheduledThreadPoolExecutor 继承了ThreadPoolExecutor 的线程池特性,配合future特性,比Timer更强大。 具体用法可以阅读JDK文档;spring Task内部也是依靠它实现的。示例代码:

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

ScheduledThreadPoolExecutor executor = (ScheduledThreadPoolExecutor)Executors.newScheduledThreadPool(10);

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

executor.schedule(new Runnable() {

@Override

public void run() {

System.out.println(Thread.currentThread().getName() + “ run ”);

}

} , 2 , TimeUnit.SECONDS);

}

executor.shutdown();

}

out:

pool-1-thread-2 run

pool-1-thread-5 run

pool-1-thread-4 run

pool-1-thread-3 run

pool-1-thread-8 run

pool-1-thread-5 run

pool-1-thread-7 run

pool-1-thread-2 run

pool-1-thread-1 run

pool-1-thread-6 run

Quartz 定时器实现

Quartz是一个完全由Java编写的开源作业调度框架,为在Java应用程序中进行作业调度提供了简单却强大的机制。Quartz允许开发人员根据时间间隔来调度作业。它实现了作业和触发器的多对多的关系,还能把多个作业与不同的触发器关联。可以动态的添加删除定时任务,另外很好的支撑集群调度。简单地创建一个org.quarz.Job接口的Java类,Job接口包含唯一的方法:

public void execute(JobExecutionContext context) throws JobExecutionException;

12

在Job接口实现类里面,添加需要的逻辑到execute()方法中。配置好Job实现类并设定好调度时间表(Trigger),Quartz就会自动在设定的时间调度作业执行execute()。

整合了Quartz的应用程序可以重用不同事件的作业,还可以为一个事件组合多个作业。Quartz通过属性文件来配置JDBC事务的数据源、全局作业、触发器侦听器、插件、线程池等等。(quartz.properties)

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

《!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz --》

《dependency》

《groupId》org.quartz-scheduler《/groupId》

《artifactId》quartz《/artifactId》

《version》2.3.0《/version》

《/dependency》123456

创建Job类

public class TestJob implements Job{

@Override

public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {

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

}

}123456

调度任务

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);

}

out :

DefaultQuartzScheduler_Worker-1test job begin 2017-06-03 14:30:33

DefaultQuartzScheduler_Worker-2test job begin 2017-06-03 14:30:34

DefaultQuartzScheduler_Worker-3test job begin 2017-06-03 14:30:35

DefaultQuartzScheduler_Worker-4test job begin 2017-06-03 14:30:36

DefaultQuartzScheduler_Worker-5test job begin 2017-06-03 14:30:37

配置参数的说明

定时器

定时器

在MONTH和Day Of Week字段里对字母大小写不敏感

定时器

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分