线程池实现原理
具体需要看ThreadPoolExecutor内部实现:
//阻塞队列
private final BlockingQueue<Runnable> workQueue;
//互斥锁
private final ReentrantLock mainLock = new ReentrantLock();
// 线程集合 一个对应的线程
private final HashSet<Worker> workers = new HashSet<>();
//终止条件
private final Condition termination = mainLock.newCondition();
//线程池数量曾到达的最大值
private int largestPoolSize;
//已完成线程数量
private long completedTaskCount;
//用户创建线程
private volatile ThreadFactory threadFactory;
//拒绝策略
private volatile RejectedExecutionHandler handler;
//线程池维护线程所允许的空闲时间
private volatile long keepAliveTime;
//判断线程是否存活
private volatile boolean allowCoreThreadTimeOut;
//线程池维护线程的核心线程数量
private volatile int corePoolSize;
//线程池最大线程数量
private volatile int maximumPoolSize;
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue)
corePoolSize:核心线程数
maximumPoolSize:最大线程数
keepAliveTime:线程存活时间(在corePore<*<maximumPoolSize情况下有用)
unit:存活时间的时间单位
workQueue:阻塞队列(用来保存等待被执行的任务)
流程图:
步骤详解:
Executor(runable) > 核心线程数 > 队列 > 最大线程数 > 阻塞