面试知识点总结之线程池

线程池参数
public ThreadpoolExecutor(int corePoolSize, int maximumPoolSize,
long keepAliveTime, TimeUnit unit,
BlockingQueue workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler){}

  1. corePoolSize:线程池核心线程大小
  2. maximumPoolSize: 线程池最大线程数量
  3. keepAliveTime: 空闲线程存活时间
  4. unit:空闲线程存货时间单位
  5. workQueue: 工作队列 (1.ArrayBlocking 2.LinkedBlockingQueue 3.SynchronizedQueue 4.PriorityBlockingQueue)
  6. ThreadFactory:线程工厂
  7. Handler 拒绝策略(工作队列任务已达到最大限制,并且线程池中数量已最大,有新任务进来怎么办?)
    1.CallerRunsPolicy:在调用者线程中直接执行被拒绝任务的run方法,除非线程池已经shutdown,则直接抛弃任务;
    2.AbortPolicy:直接丢弃任务,并抛出RejectedExecutionException异常
    3.Discardpolicy:直接丢弃,什么都不做
    4.DiscardOldestPolicy:抛弃进入队列,最早的那个任务,然后尝试把这次拒绝的任务放入队列

新门诊实施的时候初始化所用的工具,创建所有受种人模型关系
ExecutorService pool = Executors.newCachedThreadPool();

线程池的状态

  1. 线程池有运行,关闭,停止,结束四种状态,结束后就会释放所有资源
  2. 平缓关闭线程池使用shutdown()
  3. 立即关闭线程池使用shutdownNow(),同时得到来执行的任务列表
  4. 检测线程池是否处于关闭中,使用isShutdown();
  5. 检测线程池是否已经关闭使用isTerminated();
  6. 定时或者永久等待线程池关闭结束使用awaitTermination()操作

线程池Executor是异步执行任务

  1. 线程池在构造前(new操作)是初始状态,一旦构造完成线程池就进入执行状态Running(接受任务会启动线程)
  2. 线程池可以通过shutdown()和shutdownNow()来改变运行状态。shutdown()是一个平缓的关闭过程,线程池停止接受新的任务,同时等待已经提交的任务执行完毕,包括哪些进入队列还没有开始的任务,这时候线程池处于shutdown状态;shutdownNow()是立即关闭过程,线程停止接收新任务,同时取消所有执行和已进入队列的,此时stop状态
  3. 一旦shutdown()和shutdownNow()执行完毕,线程池就进入Terminated状态,此时线程池就结束了
  4. awaitTermination描述的是等待线程池关闭的时间,如果等待时间线程池还没有关闭将会抛出一个超时异常

线程池执行流程:
1.当前池中线程比核心数少,新建一个线程执行任务
2.核心池已满,但任务队列未满,添加到队列中
3.核心池已满,队列已满,试着创建一个新线程

ThreadPoolExecutor.execute:
public void execute(Runnable command) {
if (command == null)
throw new NullPointerException();

int c = ctl.get();
//1.当前池中线程比核心数少,新建一个线程执行任务
if (workerCountOf(c) < corePoolSize) {   
    if (addWorker(command, true))
        return;
    c = ctl.get();
}
//2.核心池已满,但任务队列未满,添加到队列中
if (isRunning(c) && workQueue.offer(command)) {   
    int recheck = ctl.get();
    if (! isRunning(recheck) && remove(command))    //如果这时被关闭了,拒绝任务
        reject(command);
    else if (workerCountOf(recheck) == 0)    //如果之前的线程已被销毁完,新建一个线程
        addWorker(null, false);
}
//3.核心池已满,队列已满,试着创建一个新线程
else if (!addWorker(command, false))
    reject(command);    //如果创建新线程失败了,说明线程池被关闭或者线程池完全满了,拒绝任务

}

原文地址:https://www.cnblogs.com/cgy-home/p/14522874.html