千家信息网

springboot如何创建线程池

发表于:2025-02-09 作者:千家信息网编辑
千家信息网最后更新 2025年02月09日,这篇文章主要介绍springboot如何创建线程池,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!springboot创建线程池两种方式1.使用static代码块创建这样的方式创
千家信息网最后更新 2025年02月09日springboot如何创建线程池

这篇文章主要介绍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(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注解,程序启动时创建

@Configurationpublic 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(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")

以上是"springboot如何创建线程池"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

0