「java设置定时任务」java定时任务底层原理

博主:adminadmin 2023-03-20 08:05:08 532

今天给各位分享java设置定时任务的知识,其中也会对java定时任务底层原理进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

在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怎么用定时任务实现失效

1、ZSet 实现方式

通过 ZSet 实现定时任务的思路是,将定时任务存放到 ZSet 集合中,并且将过期时间存储到 ZSet 的 Score 字段中,然后通过一个无线循环来判断当前时间内是否有需要执行的定时任务,如果有则进行执行,具体实现代码如下:

import redis.clients.jedis.Jedis;

import utils.JedisUtils;

import java.time.Instant;

import java.util.Set;

public class DelayQueueExample {

private static final String _KEY = "DelayQueueExample";

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

Jedis jedis = JedisUtils.getJedis();

// 30s 后执行

long delayTime = Instant.now().plusSeconds(30).getEpochSecond();

jedis.zadd(_KEY, delayTime, "order_1");

// 继续添加测试数据

jedis.zadd(_KEY, Instant.now().plusSeconds(2).getEpochSecond(), "order_2");

jedis.zadd(_KEY, Instant.now().plusSeconds(2).getEpochSecond(), "order_3");

jedis.zadd(_KEY, Instant.now().plusSeconds(7).getEpochSecond(), "order_4");

jedis.zadd(_KEY, Instant.now().plusSeconds(10).getEpochSecond(), "order_5");

// 开启定时任务队列

doDelayQueue(jedis);

}

/**

* 定时任务队列消费

* @param jedis Redis 客户端

*/

public static void doDelayQueue(Jedis jedis) throws InterruptedException {

while (true) {

// 当前时间

Instant nowInstant = Instant.now();

long lastSecond = nowInstant.plusSeconds(-1).getEpochSecond();

// 上一秒时间

long nowSecond = nowInstant.getEpochSecond();

// 查询当前时间的所有任务

Set data = jedis.zrangeByScore(_KEY, lastSecond, nowSecond);

for (String item : data) {

// 消费任务

System.out.println("消费:" + item);

}

// 删除已经执行的任务

jedis.zremrangeByScore(_KEY, lastSecond, nowSecond);

Thread.sleep(1000); // 每秒查询一次

}

}

}

登录后复制

2、键空间通知

我们可以通过 Redis 的键空间通知来实现定时任务,它的实现思路是给所有的定时任务设置一个过期时间,等到了过期之后,我们通过订阅过期消息就能感知到定时任务需要被执行了,此时我们执行定时任务即可。

默认情况下 Redis 是不开启键空间通知的,需要我们通过 config set notify-keyspace-events Ex 的命令手动开启,开启之后定时任务的代码如下

JAVA定时执行任务,每天定时几点钟执行任务

案例: 你想让他几点执行都ok

1.MyJob02

//首先我们需要定义一个任务类,比如为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());

}

2.

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

}

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

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

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

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

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

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

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

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

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

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

怎么在java后台,写个定时任务。比如,十分钟执行一次接口。

对于这样的操作最方便、高效的实现方式就是使用java.util.Timer工具类。

private java.util.Timer timer;//给你标注一下包,到时候别找错了

timer = new Timer(true);

timer.schedule(

new java.util.TimerTask() { public void run()

{ //你要定时执行的功能} }, 0, 30*1000);

第一个参数是要操作的功能,一般匿名内部类,第二个参数是要设定延迟的时间,第三个参

数是周期的设定,每隔多长时间执行该操作。

更详细的内容,自己找API Timer类看看吧

java设置定时任务的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java定时任务底层原理、java设置定时任务的信息别忘了在本站进行查找喔。