• 线程池框架-Spring线程池


    一、使用@Async注解的注意事项

    1、在方法上使用@Async注解,申明该方法是一个异步任务

    2、在类上面使用该@Async注解,申明该类中的所有方法都是异步任务

    3、要想使用异步任务,需要在启动类上开启异步配置,即配置上@EnableAsync注解

    4、方法上一旦标记了@Async注解,当调用这个方法时,就会开启一个新的子线程去异步处理该业务逻辑

    5、@Async注解在使用时,如果不指定线程池的名称,则使用Spring默认的线程池SimpleAsyncTaskExecutor

    二、使用@Async注解的简单示例

    第一步:启动类中需要添加@EnableAsync注解

    1. import org.springframework.boot.SpringApplication;
    2. import org.springframework.boot.autoconfigure.SpringBootApplication;
    3. import org.springframework.scheduling.annotation.EnableAsync;
    4. @EnableAsync
    5. @SpringBootApplication
    6. public class WorkApplication {
    7. public static void main(String[] args) {
    8. SpringApplication.run(WorkApplication.class, args);
    9. }
    10. }

    第二步:方法上添加@Async注解(注解的方法必须是public方法)

    1. import org.springframework.scheduling.annotation.Async;
    2. import org.springframework.stereotype.Component;
    3. @Component
    4. public class MyAsyncTask {
    5. @Async
    6. public void asyncTaskMethod(){
    7. System.out.println("线程"+Thread.currentThread().getName()+"正在执行asyncTaskMethod方法");
    8. }
    9. }

    第三步: 构建单元测试类进行测试

    1. import com.bc.work.service.MyAsyncTask;
    2. import org.junit.jupiter.api.Test;
    3. import org.springframework.beans.factory.annotation.Autowired;
    4. import org.springframework.boot.test.context.SpringBootTest;
    5. @SpringBootTest
    6. class DemoApplicationTests {
    7. @Autowired
    8. private MyAsyncTask myAsyncTask;
    9. @Test
    10. void test01(){
    11. System.out.println("线程"+Thread.currentThread().getName()+"正在执行");
    12. myAsyncTask.asyncTaskMethod();
    13. }
    14. }

    执行上述代码,其输出结果为:

    1. 线程main正在执行
    2. 线程task-1正在执行asyncTaskMethod方法

    从结果可以看出方法上一旦标记了@Async注解,当调用这个方法时,就会开启一个新的子线程去异步处理该业务逻辑

    三、默认线程池的缺陷

    上面的配置会启用Spring默认的线程池,异步执行指定的方法 。Spring默认的线程池的默认配置:

    默认核心线程数:8,

    最大线程数:Integet.MAX_VALUE

    队列:LinkedBlockingQueue(基于链表的阻塞队列)

    链表阻塞队列的容量大小:Integet.MAX_VALUE

    空闲线程保留时间:60s

    线程池拒绝策略:AbortPolicy

    从最大线程数的配置上,相信你也看到问题了:并发情况下,会无限创建线程

    默认线程池的缺陷我们可以通过在yml配置文件中自定义配置参数就可以解决这个问题:

    1. spring:
    2. task:
    3. execution:
    4. pool:
    5. core-size: 3
    6. max-size: 6
    7. keep-alive: 3s
    8. queue-capacity: 10 # 链表阻塞队列的容量大小
    9. thread-name-prefix: custom # 线程的前缀名

    再次执行上述测试类,其输出结果为:

    1. 线程main正在执行
    2. 线程custom1正在执行asyncTaskMethod方法

    四、自定义线程池(推荐使用)

    在业务场景中,有时需要使用自己定义的执行器来跑异步的业务逻辑,那么这个时候就需要我们自定义线程池。如果是在Spring Boo

  • 相关阅读:
    数组、list、set、map集合之间相互转换
    linux-ubuntu-16.04 安装系统、安装 SSH 服务、设置root用户密码
    爬虫入门基础:深入解析HTTP协议的工作过程
    Express 中间件的分类
    JDBC加载.properties文件的两种方式
    SpringBoot--手写组件动态更新@Value的值
    No168.精选前端面试题,享受每天的挑战和学习
    math_高数公式每日一过_part2(private)
    《 合 成 大 西 瓜 》 重 制 版 !( 联 机 版 在 做 了 )
    WebDAV之π-Disk派盘 + 网盘精灵
  • 原文地址:https://blog.csdn.net/y_bccl27/article/details/126799355