网易首页 > 网易号 > 正文 申请入驻

java就业培训 | 怎么实现 SpringBoot 并行任务

0
分享至

Spring Boot 的定时任务:

第一种:把参数配置到.properties文件中:

代码:

package com.accord.task;

import java.text.SimpleDateFormat;

import java.util.Date;

import org.springframework.scheduling.annotation.Scheduled;

import org.springframework.stereotype.Component;

* 从配置文件加载任务信息

* @author 王久印

@Component

public class ScheduledTask {

private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

//@Scheduled(fixedDelayString = "${jobs.fixedDelay}")

@Scheduled(fixedDelayString = "2000")

public void getTask1() {

System.out.println("任务1,从配置文件加载任务信息,当前时间:" + dateFormat.format(new Date()));

@Scheduled(cron = "${jobs.cron}")

public void getTask2() {

System.out.println("任务2,从配置文件加载任务信息,当前时间:" + dateFormat.format(new Date()));

application.properties文件:

jobs.fixedDelay=5000

jobs.cron=0/5 * * * * ?

SpringBootCron2Application.java中:

package com.accord;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication

@EnableScheduling

public class SpringBootCron2Application {

public static void main(String[] args) {

SpringApplication.run(SpringBootCron2Application.class, args);

注:@EnableScheduling 这个一定要加上;否则,不会定时启动任务!

@Scheduled中的参数说明:

  • @Scheduled(fixedRate=2000):上一次开始执行时间点后2秒再次执行;
  • @Scheduled(fixedDelay=2000):上一次执行完毕时间点后2秒再次执行;
  • @Scheduled(initialDelay=1000, fixedDelay=2000):第一次延迟1秒执行,然后在上一次执行完毕时间点后2秒再次执行;
  • @Scheduled(cron="* * * * * ?"):按cron规则执行。

在线Cron表达式生成器:http://cron.qqe2.com/

更多Java –大数据 – 前端 – UI/UE - Android - 人工智能资料下载,可访问百度:尚硅谷官网(www.atguigu.com)

第二种定时任务:单线程和多线程

1、创建定时任务:

package com.accord.task;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.scheduling.annotation.Scheduled;

import org.springframework.stereotype.Component;

* 构建执行定时任务

* @author 王久印

* TODO

@Component

public class ScheduledTask2 {

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

private int fixedDelayCount = 1;

private int fixedRateCount = 1;

private int initialDelayCount = 1;

private int cronCount = 1;

@Scheduled(fixedDelay = 5000) //fixedDelay = 5000表示当前方法执行完毕5000ms后,Spring scheduling会再次调用该方法

public void testFixDelay() {

logger.info("===fixedDelay: 第{}次执行方法", fixedDelayCount++);

@Scheduled(fixedRate = 5000) //fixedRate = 5000表示当前方法开始执行5000ms后,Spring scheduling会再次调用该方法

public void testFixedRate() {

logger.info("===fixedRate: 第{}次执行方法", fixedRateCount++);

@Scheduled(initialDelay = 1000, fixedRate = 5000) //initialDelay = 1000表示延迟1000ms执行第一次任务

public void testInitialDelay() {

logger.info("===initialDelay: 第{}次执行方法", initialDelayCount++);

@Scheduled(cron = "0 0/1 * * * ?") //cron接受cron表达式,根据cron表达式确定定时规则

public void testCron() {

logger.info("===initialDelay: 第{}次执行方法", cronCount++);

使用 @Scheduled来创建定时任务 这个注解用来标注一个定时任务方法。

通过看 @Scheduled源码可以看出它支持多种参数:

  • cron:cron表达式,指定任务在特定时间执行;
  • fixedDelay:表示上一次任务执行完成后多久再次执行,参数类型为long,单位ms;
  • fixedDelayString:与fixedDelay含义一样,只是参数类型变为String;
  • fixedRate:表示按一定的频率执行任务,参数类型为long,单位ms;
  • fixedRateString: 与fixedRate的含义一样,只是将参数类型变为String;
  • initialDelay:表示延迟多久再第一次执行任务,参数类型为long,单位ms;
  • initialDelayString:与initialDelay的含义一样,只是将参数类型变为String;
  • zone:时区,默认为当前时区,一般没有用到。

2、开启定时任务:

package com.accord;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication

@EnableScheduling

public class SpringBootCron2Application {

public static void main(String[] args) {

SpringApplication.run(SpringBootCron2Application.class, args);

注:这里的 @EnableScheduling 注解,它的作用是发现注解 @Scheduled的任务并由后台执行。没有它的话将无法执行定时任务。

引用官方文档原文:

@EnableScheduling ensures that a background task executor is created. Without it, nothing gets scheduled.

3、执行结果(单线程)

就完成了一个简单的定时任务模型,下面执行springBoot观察执行结果:

从控制台输入的结果中我们可以看出所有的定时任务都是在同一个线程池用同一个线程来处理的,那么我们如何来并发的处理各定时任务呢,请继续向下看。

更多Java –大数据 – 前端 – UI/UE - Android - 人工智能资料下载,可访问百度:尚硅谷官网(www.atguigu.com)

4、多线程处理定时任务:

看到控制台输出的结果,所有的定时任务都是通过一个线程来处理的,我估计是在定时任务的配置中设定了一个SingleThreadScheduledExecutor,于是我看了源码,从ScheduledAnnotationBeanPostProcessor类开始一路找下去。果然,在ScheduledTaskRegistrar(定时任务注册类)中的ScheduleTasks中有这样一段判断:

if (this.taskScheduler == null) {

this.localExecutor = Executors.newSingleThreadScheduledExecutor();

this.taskScheduler = new ConcurrentTaskScheduler(this.localExecutor);

这就说明如果taskScheduler为空,那么就给定时任务做了一个单线程的线程池,正好在这个类中还有一个设置taskScheduler的方法:

public void setScheduler(Object scheduler) {

Assert.notNull(scheduler, "Scheduler object must not be null");

if (scheduler instanceof TaskScheduler) {

this.taskScheduler = (TaskScheduler) scheduler;

else if (scheduler instanceof ScheduledExecutorService) {

this.taskScheduler = new ConcurrentTaskScheduler(((ScheduledExecutorService) scheduler));

else {

throw new IllegalArgumentException("Unsupported scheduler type: " + scheduler.getClass());

这样问题就很简单了,我们只需用调用这个方法显式的设置一个ScheduledExecutorService就可以达到并发的效果了。我们要做的仅仅是实现SchedulingConfigurer接口,重写configureTasks方法就OK了;

package com.accord.task;

import org.springframework.context.annotation.Configuration;

import org.springframework.scheduling.annotation.SchedulingConfigurer;

import org.springframework.scheduling.config.ScheduledTaskRegistrar;

import java.util.concurrent.Executors;

* 多线程执行定时任务

* @author 王久印

@Configuration

//所有的定时任务都放在一个线程池中,定时任务启动时使用不同都线程。

public class ScheduleConfig implements SchedulingConfigurer {

@Override

public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {

//设定一个长度10的定时任务线程池

taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10));

5、执行结果(并发)

通过控制台输出的结果看出每个定时任务都是在通过不同的线程来处理了。

文章来源于Java知音

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
A股“捡钱时代”已到来:如果手中只有12万,建议死啃这九张思维导图,从贫穷到富有就是这么简单

A股“捡钱时代”已到来:如果手中只有12万,建议死啃这九张思维导图,从贫穷到富有就是这么简单

新浪财经
2026-07-04 04:46:43
对于明天周一A股,我只说3句话:第一,3927点或将牢不可破!

对于明天周一A股,我只说3句话:第一,3927点或将牢不可破!

趋势清风侠
2026-07-05 10:02:47
杨毅:李凯尔归化是高层领导特批 他能打NBA是角色球员带不动我们

杨毅:李凯尔归化是高层领导特批 他能打NBA是角色球员带不动我们

狼叔评论
2026-07-04 20:26:08
如何判断一个人是不是性工作者?网友说看倒精方法是否老练!

如何判断一个人是不是性工作者?网友说看倒精方法是否老练!

灯锦年
2026-07-01 17:38:16
德尚:巴拉圭这种足球风格可能不太能吸引观众回到球场

德尚:巴拉圭这种足球风格可能不太能吸引观众回到球场

懂球帝
2026-07-05 07:53:06
大陆军舰刚逼近日本,台高层马上放话,公然挑衅煽动海上对抗

大陆军舰刚逼近日本,台高层马上放话,公然挑衅煽动海上对抗

深析古今
2026-07-05 17:25:12
亚洲唯一不与中国建交的国家,首都距离我国仅45公里,咋回事?

亚洲唯一不与中国建交的国家,首都距离我国仅45公里,咋回事?

抽象派大师
2026-07-03 02:13:20
“摸奶子”再惹争议,OPPO的流量反噬开始了

“摸奶子”再惹争议,OPPO的流量反噬开始了

品牌头版
2026-05-13 10:18:15
乳神落幕!巴拉圭出局社媒晒图称痛彻心扉,深情表白热爱无关胜负

乳神落幕!巴拉圭出局社媒晒图称痛彻心扉,深情表白热爱无关胜负

新杀猪的秀才
2026-07-05 09:16:55
中俄都来吊唁,但最该来的人没来,伊朗知道这时候沉不住气就完了

中俄都来吊唁,但最该来的人没来,伊朗知道这时候沉不住气就完了

霁寒飘雪
2026-07-04 10:08:28
哈梅内伊葬礼,露天高台共放置5具灵柩:女儿、女婿、儿媳、还有14个月大的外孙女;儿子穆杰塔巴仍未露面,“担心以色列借机暗杀”

哈梅内伊葬礼,露天高台共放置5具灵柩:女儿、女婿、儿媳、还有14个月大的外孙女;儿子穆杰塔巴仍未露面,“担心以色列借机暗杀”

鲁中晨报
2026-07-05 17:18:11
彻底陷入僵持!广东男篮老板陈海涛如今真是左右为难!据CBA媒体人付政浩透露

彻底陷入僵持!广东男篮老板陈海涛如今真是左右为难!据CBA媒体人付政浩透露

梦忆之浅
2026-07-05 11:10:44
法国能源巨头感叹:中国两周,法国两年

法国能源巨头感叹:中国两周,法国两年

观察者网
2026-07-05 14:26:05
世界杯头号卧底!法国超巨全场梦游,豪华锋线全被他拖垮!

世界杯头号卧底!法国超巨全场梦游,豪华锋线全被他拖垮!

澜归序
2026-07-05 07:41:01
大战当前怕违规,墨西哥队将士退还收到的价值百万美元的劳力士手表,赠送者为一美国网红

大战当前怕违规,墨西哥队将士退还收到的价值百万美元的劳力士手表,赠送者为一美国网红

红星新闻
2026-07-05 14:16:21
小泽提议在被“解放”的康城见面,普京不接话!俄军被曝地图造假

小泽提议在被“解放”的康城见面,普京不接话!俄军被曝地图造假

鹰眼Defence
2026-07-05 16:18:11
刚刚,传来重磅消息!半导体持仓的朋友,这周末或许会沸腾!

刚刚,传来重磅消息!半导体持仓的朋友,这周末或许会沸腾!

三农老历
2026-07-05 15:06:46
蒯曼为何能4-3逆转佐藤瞳?赛后邓亚萍一针见血,意志力太强

蒯曼为何能4-3逆转佐藤瞳?赛后邓亚萍一针见血,意志力太强

林子说事
2026-07-05 15:43:11
争议!巴拉圭门将出局后用球怒砸姆巴佩:他无视我的祝贺,没风度

争议!巴拉圭门将出局后用球怒砸姆巴佩:他无视我的祝贺,没风度

我爱英超
2026-07-05 08:39:40
普京1亿超级游艇突发北逃!两艘军舰死死护航,北约全线跟踪

普京1亿超级游艇突发北逃!两艘军舰死死护航,北约全线跟踪

一曲一场談
2026-07-04 16:25:26
2026-07-05 18:07:00
IT爱好者小尚
IT爱好者小尚
分享IT教育类信息
630文章数 55关注度
往期回顾 全部

科技要闻

华为:逻辑折叠将大幅提升麒麟CPU核心频率

头条要闻

网红直播时被警方当场带走 涉案金额高达50余万

头条要闻

网红直播时被警方当场带走 涉案金额高达50余万

体育要闻

姆巴佩点走巴拉圭:巴黎三代左锋传承

娱乐要闻

王力宏成都舞台受伤 仍然坚持三小时

财经要闻

揭秘跨境“对敲”换汇黑产

汽车要闻

方程豹钛9内饰曝光 用上了长联屏设计/下半年上市

态度原创

家居
艺术
游戏
旅游
军事航空

家居要闻

传奇筑 日常诗

艺术要闻

看看“馆阁体”鼻祖写的书法,比赵孟頫的字还美,狠狠打脸喷子恶评!

MSI:露馅了?还是真实水平,就那样?HLE强势横扫G2挺进胜决

旅游要闻

重庆博主打车赴拉萨视频获千万点赞 西藏文旅官宣“50万元奖励将及时兑现”

军事要闻

普京与特朗普通话85分钟 细节公布

无障碍浏览 进入关怀版