什么是线程池

​ 根据系统自身的环境情况,有效的限制执行线程的数量,使得运行效果达到最佳。线程主要是通过控制执行的线程的数量,超出数量的线程排队等候,等待有任务执行完毕,再从队列最前面取出任务执行。

线程池作用

  1. 减少创建和销毁线程的次数,每个工作线程可以多次使用
  2. 可根据系统情况调整执行的线程数量,防止消耗过多内存

常见线程池及使用

// 单个线程的线程池,即线程池中每次只有一个线程工作,单线程串行执行任务(队列)
ExecutorService pool = Executors.newSingleThreadExecutor();

// 固定数量的线程池,每提交一个任务就是一个线程,直到达到线程池的最大数量,然后后面进入等待队列直到前面的任务完成才继续执行
ExecutorService pool = Executors.newFixedThreadExecutor(5);

// 可缓存线程池,当线程池大小超过了处理任务所需的线程,那么就会回收部分空闲(一般是60秒无执行)的线程,当有任务来时,又智能的添加新线程来执行
ExecutorService pool = Executors.newCacheThreadExecutor();

// 大小无限制的线程池,支持定时和周期性的执行线程
ExecutorService pool = Executors.newScheduleThreadExecutor();

Spring自定义线程池

 ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        // 核心线程数
        executor.setCorePoolSize(8);
       	// 缓存队列
        executor.setQueueCapacity(32);
    	// 最大线程数
        executor.setMaxPoolSize(32);
    	// 溢出拒绝策略
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
    	// 线程名前缀
        executor.setThreadNamePrefix("ThreadPool-");
     	 // 允许空闲时间
        executor.setKeepAliveSeconds(30);