首页 > 其他分享 >SpringBoot实现多线程

SpringBoot实现多线程

时间:2023-02-12 10:57:16浏览次数:42  
标签:异步 SpringBoot 实现 线程 executor 多线程 ThreadPoolTaskExecutor public

多线程方式一:实现AsyncConfigurer 接口

配置类实现接口AsyncConfigurer,返回一个ThreadPoolTaskExecutor 线程池对象。

@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {

    // ThredPoolTaskExcutor的处理流程
    // 当池子大小小于corePoolSize,就新建线程,并处理请求
    // 当池子大小等于corePoolSize,把请求放入workQueue中,池子里的空闲线程就去workQueue中取任务并处理
    // 当workQueue放不下任务时,就新建线程入池,并处理请求,如果池子大小撑到了maximumPoolSize,就用RejectedExecutionHandler来做拒绝处理
    // 当池子的线程数大于corePoolSize时,多余的线程会等待keepAliveTime长时间,如果无请求可处理就自行销毁

    @Override
    @Bean
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        // 核心线程数:线程池创建的时候初始化的线程数
        executor.setCorePoolSize(10);
        // 最大线程数:线程池最大的线程数,只有缓冲队列满了之后才会申请超过核心线程数的线程
        executor.setMaxPoolSize(100);
        // 缓冲队列:用来缓冲执行任务的队列
        executor.setQueueCapacity(50);
        // 线程池关闭:等待所有任务都完成再关闭
        executor.setWaitForTasksToCompleteOnShutdown(true);
        // 等待时间:等待5秒后强制停止
        executor.setAwaitTerminationSeconds(5);
        // 允许空闲时间:超过核心线程之外的线程到达60秒后会被销毁
        executor.setKeepAliveSeconds(60);
        // 线程名称前缀
        executor.setThreadNamePrefix("learn-Async-");
        // 初始化线程
        executor.initialize();
        return executor;
    }

    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return null;
    }
}

通过@Async注解表明该方法是异步方法,如果注解在类上,那表明这个类里面的所有方法都是异步的。 

@Service
public class AsyncService {
    @Async  // 表明该方法是异步方法。如果注解在类上,那表明类里面的所有方法都是异步
    public void executeAsyncTask(int i) {
        System.out.println("线程" + Thread.currentThread().getName() + " 执行异步任务:" + i);
    }
}

多线程方式二:配置 java.util.concurrent.TaskExecutor

新增一个配置类,默认情况下使用 SimpleAsyncTaskExecutor

@Configuration
@EnableAsync //启用异步任务
public class ThreadConfig {
    @Bean
    public ThreadPoolTaskExecutor executor(){
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
      	//配置核心线程数
        executor.setCorePoolSize(15);
      	//配置最大线程数
        executor.setMaxPoolSize(30);
      	//配置队列大小
        executor.setQueueCapacity(1000);
      	//线程的名称前缀
        executor.setThreadNamePrefix("Executor-");
      	//线程活跃时间(秒)
        //executor.setKeepAliveSeconds(60);
      	//等待所有任务结束后再关闭线程池
        executor.setWaitForTasksToCompleteOnShutdown(true);
      	//设置拒绝策略
        //executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
      	//执行初始化
        executor.initialize();
        return executor;
    }
}

 

 

 

注解@Async失效的情况

 

标签:异步,SpringBoot,实现,线程,executor,多线程,ThreadPoolTaskExecutor,public
From: https://www.cnblogs.com/xfeiyun/p/17113387.html

相关文章

  • Java的单继承与多实现
    Java和C、C++不同,C和C++允许多继承多实现,但是Java不能:Java是单继承的(extends),所谓单继承是指当前子类只能有一个直接的父类;在多继承的情况下如果多个父类有相同的方法那么......
  • Spring Boot+Mybatis-1:集成 Mybatis 并实现 CRUD(1)
    读前需知:此系列属于个人学习过程中的学习记录,不保证是最优方案,请读者大佬们带点批判进行阅读。如有技术上的错误望不吝赐教~1.前言MyBatis是一款持久层框架,它支持自定义......
  • springboot 配置redis集群 JedisCluster 3主3从 哈希槽模式
    packagecom.estate.util;importredis.clients.jedis.*;importjava.util.HashSet;importjava.util.Set;publicclassRedisClient{privatestaticJedis......
  • android开发kotlin顶级函数和拓展函数的实现原理
    android开发kotlin顶级函数和拓展函数的实现原理//我们编写的源代码在MainActivity.kt下面,如下:funtopTest(){print("123")}funMainActivity.extTest(){pr......
  • 事件监听器 - 实现异步监听
    异步监听代码实现:publicclassAsyncApplicationEventMulticasterextendsAbstractApplicationEventMulticaster{privateTaskExecutortaskExecutor=newSim......
  • Kitten 动态绘制 Y 轴方向立方体的实现方法
    我们之前的实践里,已经探讨了在水平方向动态绘制立方体的积木搭建方法,如下图所示:接下来我们期望在Y轴方向也绘制立方体,如下图所示。其实只需要在水平方向依次绘制两列......
  • Python实现截图功能
    通过Python实现直接截屏或截取特定区域的屏幕截图的功能,具体实现如下:#GrabScreenshot#pipinstallpyautogui#pipinstallPillowfrompyautoguiimportscreensho......
  • #yyds干货盘点#【愚公系列】2023年02月 微信小程序-电商项目-添加收货地址功能实现
    前言在电商系统中,收货地址是必不可少的功能,没有收货地址用户在下单就没法收到货,而且一个用户会有多个收货地址,比如寄给自己,或者寄给别人。一搬在收货地址选择中会有个默认......
  • 多线程面试题
    实现线程有哪几种方式?4种https://blog.csdn.net/weixin_46217160/article/details/108721306A继承类Thread,重写run()方法,调用Thread类中的start()方法启动线程;MyThrea......
  • 多线程
    继承thread     2        ......