springboot创建线程池的两种方式小结
作者:若未 发布时间:2022-07-12 09:27:19
标签:springboot,线程池,创建
springboot创建线程池两种方式
1.使用static代码块创建
这样的方式创建的好处是当代码用到线程池的时候才会初始化核心线程数
具体代码如下:
public class HttpApiThreadPool {
/** 获取当前系统的CPU 数目*/
static int cpuNums = Runtime.getRuntime().availableProcessors();
/** 线程池核心池的大小*/
private static int corePoolSize = 10;
/** 线程池的最大线程数*/
private static int maximumPoolSize = cpuNums * 5;
public static ExecutorService httpApiThreadPool = null;
/**
* 静态方法
*/
static{
System.out.println("创建线程数:"+corePoolSize+",最大线程数:"+maximumPoolSize);
//建立10个核心线程,线程请求个数超过20,则进入队列等待
httpApiThreadPool = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, 0L,
TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(100),new ThreadFactoryBuilder().setNameFormat("PROS-%d").build());
}
}
使用方法
public static void main(String[] args) {
HttpApiThreadPool.httpApiThreadPool.execute(()->System.out.println("测试"));
}
注意:
1.不能使用Executors的方法创建线程池,这个是大量的生产事故得出来的结论
2.maximumPoolSize本程序使用的是cup数的5倍,你可以看你实际情况用
3.new ThreadFactoryBuilder().setNameFormat("PROS-%d").build() 给每个线程已名字,可以方便调试
2.使用@Configuration @bean注解,程序启动时创建
@Configuration
public class TreadPoolConfig {
private Logger logger = LoggerFactory.getLogger(TreadPoolConfig.class);
/** 获取当前系统的CPU 数目*/
int cpuNums = Runtime.getRuntime().availableProcessors();
/** 线程池核心池的大小*/
private int corePoolSize = 10;
/** 线程池的最大线程数*/
private int maximumPoolSize = cpuNums * 5;
/**
* 消费队列线程
* @return
*/
@Bean(value = "httpApiThreadPool")
public ExecutorService buildHttpApiThreadPool(){
logger.info("TreadPoolConfig创建线程数:"+corePoolSize+",最大线程数:"+maximumPoolSize);
ExecutorService pool = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, 0L,
TimeUnit.MILLISECONDS, new ArrayBlockingQueue<Runnable>(100),new ThreadFactoryBuilder().setNameFormat("PROS-%d").build());
return pool ;
}
}
使用方法
//注入
@Resource
private TreadPoolConfig treadPoolConfig;
//调用
public void test() {
treadPoolConfig.buildHttpApiThreadPool().execute(()->System.out.println("tre"));
}
现在两种线程池的创建方法已经介绍完了。
springboot如何开启线程池
定义线程池
定义的位置,要在启动类的子包或者同级目录中
import lombok.Data;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.ThreadPoolExecutor;
@Data
@Configuration
@EnableAsync //开启异步请求
public class ThreadPoolConfig {
private static final int corePoolSize = 10; // 核心线程数(默认线程数)
private static final int maxPoolSize = 100; // 最大线程数
private static final int keepAliveTime = 10; // 允许线程空闲时间(单位:默认为秒)
private static final int queueCapacity = 500; // 缓冲队列数
/**
* 默认异步线程池
* @return
*/
@Bean("taskExecutor")
public ThreadPoolTaskExecutor taskExecutor(){
ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor();
pool.setThreadNamePrefix("--------------全局线程池-----------------");
pool.setCorePoolSize(corePoolSize);
pool.setMaxPoolSize(maxPoolSize);
pool.setKeepAliveSeconds(keepAliveTime);
pool.setQueueCapacity(queueCapacity);
// 直接在execute方法的调用线程中运行
pool.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
// 初始化
pool.initialize();
return pool;
}
}
使用
直接在需要异步执行的方法上加注解
@Async("taskExecutor")
来源:https://blog.csdn.net/qq_34204599/article/details/106013204
0
投稿
猜你喜欢
- 一个简单的HelloSpringMVC程序先在web,xml中注册一个前端控制器(DispatcherServlet) <?xml v
- Android 中下拉菜单,即如html中的<select>,关键在于调用setDropDownViewResource方法,以
- 需求背景闲话不扯,直奔主题。需要和web前端建立长链接,互相实时通讯,因此想到了websocket,后面随着需求的变更,需要用户订阅主题,实
- java 8引入了lambda表达式,lambda表达式实际上表示的就是一个匿名的function。在java 8之前,如果需要使用到匿名f
- 关于链表链表是有序的列表链表是以节点的方式来存储每个节点包含data域,next域(指向下一个节点)分带头节点的链表和没有头节点的链表定义一
- 今天在码代码的时候突然想到这个问题,觉得有点困惑。在网上也翻阅不少帖子其中有一个帖子给了我一个思路,其实也是解释了基础概念。概念一:try
- spring-MVC实现简单的登录功能,供大家参考,具体内容如下今天我学习了spring-MVC实现简单的登录功能,本篇博客就讲解如何使用s
- 介绍java中Pair在这篇文章中,我们讨论了一个非常有用的编程概念,配对(Pair)。配对提供了一种方便方式来处理简单的键值关联,当我们想
- Spring Security简介:Spring Security 是针对Spring项目的安全框架,也是Spring Boot底层安全模块
- 需求:将 一个容器List<Bean> 按照一定的字段进行分组,分组过后的值为特定的BEAN 里面的属性例如:假定有这样一个Be
- ProgressDialog(精度条对话框):1.直接调用ProgressDialog提供的静态方法show()显示2.创建Progress
- 前言最近写了一篇博客是关于 使用Jenkins来构建SVN+Maven项目 ,这里使用的的代码版本工具是SVN,但是事实上也有很多公司使用G
- 面试题:1同步方法和同步块,哪种更好?2.如果同步块内的线程抛出异常会发生什么?1. 同步方法和同步块,哪种更好?同步块更好,这意味着同步块
- 一.服务器端获取Session对象依赖于客户端携带的Cookie中的JSESSIONID数据。如果用户把浏览器的隐私级别调到最高,这时浏览器
- 01-前言:什么是循环依赖?首先,我们先明确下依赖的定义。 如果一个 Bean bar 的属性,引用了容器中的另外一个 Bean foo,那
- 1.查找文件find / -name filename.txt 根据名称查找/目录下的filename.txt文件。find . -name
- 前言本文章接上一篇文章继续谈一谈condition的一些用法。案例上一篇文章我提的一个需求时导入jedis坐标后才能加载该Bean,否则不加
- yml 文件规则yml文件的好处,天然的树状结构,一目了然,实质上跟properties是差不多的。不支持tab缩进可以使用 "-
- 这一篇我们说说Java线程Thread的interrupt中断机制。中断线程线程的thread.interrupt()方法是中断线程,将会设
- 使用场景当遇到需要临时修改的 bug,但当前正在开发的内容不能删掉,这个时候就需要把当前已经开发的代码另外保存下来(即保存现场),当把 bu