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

springboot中使用线程池

1.什么场景下使用线程池?

在异步的场景下,可以使用线程池

不需要同步等待,

不需要管上一个方法是否执行完毕,你当前的方法就可以立即执行

我们来模拟一下,在一个方法里面执行3个子任务,不需要相互等待

2.代码引入线程池配置类

package com.example.demo2.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.concurrent.*;/*** 线程池工具类*/
@Configuration
public class XianChengConfig {/*** 创建线程池放入ioc容器*/@Beanpublic ThreadPoolExecutor threadPoolExecutor(){//核心线程数int corePoolSize = 10;//最大线程数int maximumPoolSize =10;//线程存活时间单位long keepAliveTime = 60;//线程存活时间 秒TimeUnit unit = TimeUnit.SECONDS;//任务队列BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(100);//线程工厂ThreadFactory threadFactory = Executors.defaultThreadFactory();//拒绝策略 谁调用谁执行RejectedExecutionHandler handler = new ThreadPoolExecutor.CallerRunsPolicy();ThreadPoolExecutor bean = new ThreadPoolExecutor( corePoolSize,maximumPoolSize,keepAliveTime,unit,workQueue,threadFactory,handler);return bean;}
}

3.使用线程池

package com.example.demo2.controller;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.concurrent.ThreadPoolExecutor;@RestController
public class TestController {@Autowiredprivate ThreadPoolExecutor threadPoolExecutor;@GetMapping("/test")public String test() {System.out.println("---------------方法1------------------");threadPoolExecutor.execute(()->{//异步执行 角色任务syncRole();});System.out.println("---------------方法2------------------");threadPoolExecutor.execute(()->{//异步执行 用户任务syncUser();});System.out.println("----------------方法3-----------------");threadPoolExecutor.execute(()->{//异步执行 菜单任务syncMenu();});return "ok";}private void syncRole(){System.out.println("开始获取角色,线程名称:"+Thread.currentThread().getName());try {//阻塞4秒Thread.sleep(1000*4);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("结束获取角色,线程名称:"+Thread.currentThread().getName());}private void syncUser(){System.out.println("开始获取用户,线程名称:"+Thread.currentThread().getName());try {//阻塞3秒Thread.sleep(1000*3);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("结束获取用户,线程名称:"+Thread.currentThread().getName());}private void syncMenu(){System.out.println("开始获取菜单,线程名称:"+Thread.currentThread().getName());try {//阻塞2秒Thread.sleep(1000*2);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("结束获取菜单,线程名称:"+Thread.currentThread().getName());}
}

http://localhost:8080/test

可以看到,角色没有执行完,用户开始执行

用户没有执行完,菜单也开始执行

3个任务不需要等待其他方法执行完,才去执行自己的任务

这就是异步的场景,这种场景下就可以使用多线程

http://www.dtcms.com/a/267322.html

相关文章:

  • 【Elasticsearch】检索排序 分页
  • 20. 有效的括号
  • BUUCTF在线评测-练习场-WebCTF习题[网鼎杯 2020 青龙组]AreUSerialz1-flag获取、解析
  • 【Flask】flask中get方法和post方法区别
  • CMake基础:条件判断详解
  • openai和chatgpt什么关系
  • 单用户模式、紧急模式、救援模式有什么区别
  • 动手学深度学习-学习笔记【二】(基础知识)
  • 若 VSCode 添加到文件夹内右键菜单中显示(通过reg文件方式)
  • 在 Windows 上安装和运行 Apache Kafka
  • Android Input 系列专题【事件的读取与分发】
  • 在SSM+vue项目中上传表单数据和文件
  • android开发中的 AndroidX 版本的查看 及 constraintLayout的简单用法
  • 【性能优化】程序性能优化:疏通胜于堵塞
  • 【Elasticsearch】检索高亮
  • 成为git砖家(12): 看懂git合并分支时冲突提示符
  • HTML初学者第三天
  • hono框架绑定cloudflare的d1数据库操作步骤
  • Redis基础的介绍与使用(一)(Redis简介以及Redis下载和安装)
  • Git 版本控制完全指南:从入门到精通
  • 【Halcon】WPF 自定义Halcon显示控件完整流程与 `OnApplyTemplate` 未触发的根本原因解析!
  • Web3 Study Log 003
  • 蓝牙墨水屏上位机学习(3)
  • Java 与 Vue 全栈开发:“一课一得“ 学习笔记系统实战
  • OneCode图表配置速查手册
  • CMake是什么
  • NV183NV185美光固态闪存NV196NV201
  • 供应链管理-采购管理:国际贸易及支付领域中常见的支持方式
  • FLUX.1-Kontext 高效训练 LoRA:释放大语言模型定制化潜能的完整指南
  • 软件版本FCCU(故障采集与控制单元)设计