本篇概要:
1.什么是线程池
2.如何用java代码创建线程池
3.ThreadPoolExecutor里面重要的参数
一、什么是线程池:
线程池就是开发者根据需求创建多个线程放到一个池中(逻辑意义上),来统一管理这些线程,由池中的任务队列来直接给池中的空闲线程分配任务,大致为这样的一个过程。简而言之就是提前把线程准备好,创建线程不是直接从系统申请而是从线程池里面拿已经创建好的线程,线程使用完毕了就还给线程池。
二、如何用java代码创建线程池:
方法一:使用Executors工厂类来创建
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Demo {
public static void main(String[] args) {
ExecutorService pool= Executors.newFixedThreadPool(10);
//上面是通过Executors类里面的静态方法完成对象的构造
pool.submit(new Runnable() {//添加任务到线程池中
@Override
public void run() {
System.out.println("hello");
}
});
}
}
方法二: 使用ThreadPoolExecutor类来创建
BlockingQueue<Runnable> queue = new LinkedBlockingQueue<>();
ThreadPoolExecutor pool = new ThreadPoolExecutor(5,10,60,TimeUnit.SECONDS,queue);
上面的参数corePoolSize(核心线程数)为5;maximumPoolSize(最大线程数)为10
keepAliveTime(临时线程最大空闲时间)为60;TimeUnit.SECOND:单位为秒
queue为任务队列
三、ThreadPoolExecutor里面重要的参数:
本文列举了ThreadPoolExecutor的以下几个重要的参数(corePoolSize,maximumPoolSize,BlockingQueue,ThreadFactory,RejectedExecutionHandler)
(1)corePoolSize:
这个参数代表当前的核心线程数
(2)maximumPoolSize:
这个参数代表当前的最大线程数,(1)和(2)的区别就相当于前者是一个公司的正式员工的数量,而后者相当于一个公司的正式员工加上实习生的数量
(3)BlockingQueue:
线程池里面需要管理很多的任务,这些任务是通过BlockingQueue这个阻塞队列来组织的
(4)ThreadFactory :
用于辅助线程创建的类(参考工厂模式)
(5)RejectedExecutorHandler:
这个参数就是线程池的拒绝策略(这个策略就是如果线程池的池子满了该如何拒绝继续往池子里面添加任务)
在标准库中提供了如下图的四种拒绝策略
AbortPolicy:如果线程池满了再继续添加任务此时就直接抛出异常。
CallerRunsPolicy:让添加的线程自己去负责执行这个任务。
DiscardOldestPolicy:丢弃最老的任务。
DiscardPolicy:丢弃最新的任务。