IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> SpringBoot开启异步多线程 -> 正文阅读

[Java知识库]SpringBoot开启异步多线程

前言:

? ? ? ? SpringBoot 的异步多线程需要从 java 的多线程基础说起,可以参考?java 多线程实现的三种方式区别。SpringBoot 在此基础上进行了多次封装,所以使用起来非常方便。

一、核心参数说明

????????ThreadPoolExecutor 是 java 的核心线程池类;Spring 对 ThreadPoolExecutor 进行二次封装形成了 ThreadPoolTaskExecutor,其中几个核心参数除了名字略有改动,核心含义没变,下面说明一下:

  • corePoolSize:核心线程池数
  • maxPoolSize:最大线程池数
  • queueCapacity:线程池队列最大容量
  • keepAliveSeconds:允许线程的空闲时间,核心线程外的线程在空闲时间到达后会被销毁
  • threadNamePrefix:线程池名的前缀
  • rejectedExecutionHandler:拒绝策略

其中拒绝策略是线程达到某种饱和后的线程池的操作策略,总共四种:

  • AbortPolicy:如果线程池队列满了丢掉任务并且抛出RejectedExecutionException异常
  • DiscardPolicy:如果线程池队列满了,会直接丢掉这个任务并且不会抛出异常
  • DiscardOldestPolicy:如果队列满了,会将最早进入队列的任务删掉,再尝试加入队列
  • CallerRunsPolicy:如果添加到线程池失败,那么主线程会自己去执行该任务

说明一下几个核心参数和拒绝策略是怎么工作的:

1.核心线程数:m,最大线程数: n(一般 n >?m),线程池队列最大容量: j,线程总数: s;

2.线程进场后(s<m),线程会直接启动直到启动的线程数达到核心线程数(s=m);

3.线程继续进场(m<s<m+j),线程开始排队,此时启动的线程数不会增加直到队列饱和(s=m+j);

4.线程继续进场(m+j<s<n+j),每进场一个线程,该线程就会启动;直到启动的线程达到最大线程数(s=n+j);

5.线程继续进场(s>n+j),此时触发拒绝策略;

二、使用说明

? 首先配置线程池:

@Configuration
@EnableAsync
public class ThreadPoolConfig {

    @Bean("normalThreadPool")  //线程池实例名,多个线程池配置需要声明,一个线程池可有可无
    public Executor executorNormal() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(3);
        executor.setMaxPoolSize(5);
        executor.setQueueCapacity(3);
        executor.setKeepAliveSeconds(60);
        executor.setThreadNamePrefix("NORMAL--");
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
        executor.initialize();
        return executor;
    }
}

其次在需要异步的方法上加 @Async 注解:

@Slf4j
@Service
public class ThreadTaskService {

    @Async("normalThreadPool") //多个线程池配置时需指定配置实例
    public void task() {
        log.info("task start...");
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        log.info("task end...");
    }

}

异步的调用跟普通 service 方法没区别:

@Slf4j
@RestController
@RequestMapping("/thread")
public class ThreadTaskController {

    @Autowired
    ThreadTaskService taskService;

    @GetMapping(value = "/start")
    public String getValue() {
        taskService.task();
        return "hello...";
    }
}

三、带返回值的异步

要获取异步函数的返回值可以使用 Future,但是Future 的get方法是阻塞的,使用时需要注意。

    @Async("normalThreadPool")
    public CompletableFuture<String> task() {
        String result = "000";
        log.info("task start...");
        try {
            Thread.sleep(5000);
            result = "333";
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        log.info("task end...");
        return CompletableFuture.completedFuture(result);
    }
@Slf4j
@RestController
@RequestMapping("/thread")
public class ThreadTaskController {
    @Autowired
    ThreadTaskService taskService;

    @GetMapping(value = "/start")
    public String getValue() throws ExecutionException, InterruptedException {

        CompletableFuture<String> result = taskService.task();

        log.info("result:{}", result.get()); // get 方法会使主线程阻塞

        return "hello...";
    }
}

四、几种异步失败的情况

1. 异步方法使用static关键词修饰;

2. 缺少?@EnableAsync?注解;

3.?同一个类中,一个方法调用另外一个有@Async注解的方法(原因是@Async注解的方法,是在代理类中执行的);

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-09-04 00:56:31  更:2022-09-04 00:57:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 13:27:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码