为什么使用线程池?
摘录自 YourBatman
在Java中,我们一般通过集成 Thread
类和实现 Runnnable
接口,调用线程的 start()
方法实现线程的启动。但如果并发的数量很多,而且每个线程都是执行很短的时间便结束了,那样频繁的创建线程和销毁进程会大大的降低系统运行的效率。线程池正是为了解决多线程效率低的问题而产生的,他使得线程可以被复用,就是线程执行结束后不被销毁,而是可以继续执行其他任务。
使用场景
- 当你的任务是非必要的时候。比如记录操作日志、通知第三方服务非必要信息等,可以使用线程池处理非阻塞任务。
- 当你的任务非常耗时时候,可以采用线程池技术。
- 当请求并发很高时,可以采用线程池技术优化处理。
ThreadPoolConfiguration 配置类
import java.util.concurrent.ThreadPoolExecutor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
/**
* @ClassName: ThreadPoolConfiguration
* @Description: 线程池配置
* @author: hanshui
* @date: 2019/7/22 19:10
*/
@Configuration
@EnableAsync
public class ThreadPoolConfiguration {
/**
* 默认情况下,在创建了线程池后,线程池中的线程数为0,当有任务来之后,就会创建一个线程去执行任务,
* 当线程池中的线程数目达到corePoolSize后,就会把到达的任务放到缓存队列当中;
* 当队列满了,就继续创建线程,当线程数量大于等于maxPoolSize后,开始使用拒绝策略拒绝。
*/
/**
* 核心线程数(默认线程数)
*/
private static final int corePoolSize = 1;
/**
* 最大线程数
*/
private static final int maxPoolSize = 10;