• 面试知识点总结之线程池


    线程池参数
    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);    //如果创建新线程失败了,说明线程池被关闭或者线程池完全满了,拒绝任务
    

    }

  • 相关阅读:
    MIPI DIsplay Panel And Linux Driver Model【转】
    Vim|多行行尾插入【转】
    LCD之mipi DSI接口驱动调试流程【转】
    Linux中的DRM 介绍【转】
    linux DRM driver 使用示例【转】
    从零开始写设备树DTS【转】
    linux内核中的宏ffs(x)【转】
    procps工具集 ----Linux中的可用内存指的是什么?【转】
    ps命令交叉编译【转】
    交叉编译Procps-ng-3.3.11【转】
  • 原文地址:https://www.cnblogs.com/cgy-home/p/14522874.html
Copyright © 2020-2023  润新知