当前位置: 首页 > java >正文

@Scheduled定时任务单线程和多线程

1:默认所有的@Scheduled方法由单线程调度

2:如果需要多线程可以有两种方式去设置线程池

2.1 自定义一个ScheduleConfig,实现SchedulingConfigurer的configureTasks方法

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;import java.util.concurrent.Executors;/**
* 多线程定时任务
*/
@Configuration
public class ScheduleConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {//设定一个长度9的定时任务线程池taskRegistrar.setScheduler(Executors.newScheduledThreadPool(9));
}
}

2.2 自定义 一个TaskScheduler 或者 ScheduledExecutorService 类的bean, 那为啥是这两个类型的bean呢? 请参考源码:org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor#finishRegistration 的方法;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

scheduler在registrar的时候 会先后在beanFactory查找是否有TaskScheduler 和 ScheduledExecutorService 类型的bean; 如果有,则作为执行scheduler的线程池;

所以如果设置@Scheduled 多线程执行 则还可以在xml 配置 TaskScheduler 或ScheduledExecutorService 类型的bean, 因为在registrar是按照类型装配,所以自定义的beanName 无特殊要求, 也可以直接在java类里直接定义一个 如:

import java.util.concurrent.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;@Configuration
public class ScheduledConfig {/** 以下bean  二选一**/	@Beanpublic ScheduledExecutorService scheduledThreadPool() {ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(9);       return scheduledThreadPool;}@Beanpublic TaskScheduler taskScheduler() {ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();taskScheduler.setPoolSize(9);return taskScheduler;}}

PS : 因为 TaskScheduler 和 ScheduledExecutorService 为 interface ;所以scheduler在registrar的时候装配的是它们实现类的bean

总结:实现@Scheduled 任务由多线程(线程池)调度有两种方式, 方式一: 自定义一个ScheduleConfig,实现SchedulingConfigurer的configureTasks方法。 方式二: 配置 TaskScheduler 或ScheduledExecutorService 类型的bean,@Scheduled会自动调度线程池中的多线程执行job

http://www.xdnf.cn/news/11169.html

相关文章:

  • 华为突遭谷歌釜底抽薪!官方安卓不再支持华为手机(2)
  • 快速使用Monkey测试工具的方法(1),2024年最新软件测试综合面试
  • PE安装系统保姆教程
  • [山东大学操作系统课程设计]实验六
  • Lifekeeper产品正版与盗版的区别
  • 数据库SQL入门教程基础知识
  • jsp的session介绍 (转)
  • 解决因找不到d3dx9_29.dll而无法运行程序的问题
  • 不兼容android5.1.1,为什么你的手机刷不上Android 5.1系统?需要具备哪些条件呢?...
  • 详解Oracle RAC入门和提高
  • 激光雷达运动畸变去除方法
  • Citrix VDI实战攻略之五:vDisk配置
  • CDN加速原理详解
  • 嵌入式TCP硬件设计--------LAN8720芯片使用记录
  • 开源web终端ssh解决方案-gateone简介
  • 创龙TMS320C6748开发板———EDMA简介及配置
  • 启动应用程序出现dxdiag.exe找不到问题解决
  • 路由器不能端口映射什么原因?如何设置内网映射?
  • 汇川触摸屏IT7000E和汇川中小型系列PLC连接及MW寄存器说明
  • 安装虚拟机(VMware)保姆级教程及配置虚拟网络编辑器和安装WindowsServer以及宿主机访问虚拟机和配置服务器环境
  • 用CSS绘制最常见的40种形状和基本图形
  • C#实现使用Timer组件实现世界杯倒计时(附完整源码)
  • 标准布朗运动的定义、代码和图像
  • 服务器端口怎么开放?
  • 动态发布站点的并发访问升级简易方案
  • 网工配置命令基础总结(2)----VRRP配置
  • 魔兽世界台服被大陆玩家挤爆
  • STM32单片机——看门狗(独立看门狗窗口看门狗)
  • Ajax的使用(详解)
  • linux命令、vi命令、vim命令、shell语法(完整详细)