线程池

工作流程

运行流程:

  1. 线程池创建,准备好core数量的核心线程,准备接受任务
  2. 新的任务进来,用core准备好的空闲线程执行。
    1. 如果core线程满,就将再进来的任务放入阻塞队列中。空闲的core就会自己去阻塞队列获取任务执行
    2. 如果阻塞队列满了,就直接开新线程执行,最大只能开到max指定的数量
    3. max都执行好了。Max-core数量空闲的线程会在keepAliveTime指定的时间后自动销毁。最终保持到core大
    4. 如果线程数开到了max的数量,还有新任务进来,就会使用reject指定的拒绝策略进行处理
  3. 所有的线程创建都是由指定的factory创建的。

问题 : 一个线程池core 7, max 20,queue: 50, 100并发,如何分配

答:先有7个能直接得到执行,接下来50个进入队列排队,在多开13个继续执行。现在70个被安排上了。剩下30个默认拒绝策略。

使用

  1. 配置线程池
@Configuration
public class MyThreadConfig {
    @Bean
    public ThreadPoolExecutor threadPoolExecutor(ThreadPoolConfigProperties pool) {
        return new ThreadPoolExecutor(
            	pool.getCoreSize(),
                pool.getMaxSize(),
                pool.getKeepAliveTime(),
                TimeUnit.SECONDS,
                new LinkedBlockingDeque<>(10000),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy());
    }
}
  1. 设置线程池参数, 可以使用配置文件进行参数修改
@ConfigurationProperties(prefix = "emall.thread")
@Component
@Data
public class ThreadPoolConfigProperties {
    private Integer coreSize;
    private Integer maxSize;
    private Integer keepAliveTime;
}
emall.thread.core-size=20
emall.thread.max-size=200
emall.thread.keep-alive-time=10