具体需要看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) > 核心线程数 > 队列 > 最大线程数 > 阻塞