springboot创建线程池的两种方式小结

网友投稿 1256 2022-09-06


springboot创建线程池的两种方式小结

目录springboot创建线程池两种方式1.使用static代码块创建2.使用@Configuration @bean注解,程序启动时创建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注解,程序启动时创建

@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(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(corePoolShttp://ize);

pool.setMaxPoolSize(maxPoolSize);

pool.setKeepAliveSeconds(keepAliveTime);

pool.setQueueCapacity(queueCapacity);

// 直接在execute方法的调用线程中运行

pool.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());

// 初始化

pool.initialize();

return pool;

}

}

使用

直接在需要异步执行的方法上加注解

@Async("taskExecutor")


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:【Pygame实战】星战领衔,修仙种田,四月我们能玩到什么游戏?这款《星际大战》不容错过啦~
下一篇:Python教程:两种求最大公约数和最小公倍数的方法(Python最大公约数最小公倍数)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~