美文网首页
9. Java中的线程池

9. Java中的线程池

作者: 星冉子 | 来源:发表于2020-02-13 10:08 被阅读0次

    使用线程池的好处

    降低资源消耗:重复利用线程,降低创建和销毁的消耗;

    提高响应速度:任务到达时可马上执行,不需要等待线程创建;

    提高线程的可管理型:统一分配、调优、监控线程资源;

    线程池实现原理

    ThreadPoolExecutor提交新任务时的处理流程:

    1. 判断核心线程池是否已满,否则创建线程执行任务,是则进入下一步;(即使核心线程池有空闲线程,如果未满也会创建新线程)

    2. 判断任务队列是否已满,否则将任务加入队列,是则进入下一步;(若使用无界队列则此步无意义,始终未满)

    3. 判断整个线程池是否已满,否则创建线程执行任务,是则按照饱和策略处理;(可能先添加的任务在队列中排队,而后面的任务先执行)

    提交到线程池的任务会封装成工作线程,循环获取任务执行;

    创建线程池

    创建线程池的参数:

    corePoolSize:核心线程数量;

    runnableTaskQueue:任务队列,阻塞队列;

    maximumPoolSize:线程池最大数量;包含核心线程数;

    ThreadFactory:线程创建工厂,可统一命名;

    rejectedExecutionHandler:队列和线程池都满时的处理策略,包括抛异常、原线程中运行、丢弃队列中的最后一个任务执行、不处理丢弃;

    keepAliveTime:工作线程空闲后的存活时间;

    向线程池提交任务

    2种方式:execute:用于提交不需要返回值的任务;submit:用于提交需要有返回值的任务;

    关闭线程池

    shutdown:遍历所有线程调用线程的中断方法,无法响应中断的线程永远无法停止,线程池状态置为SHUTDOWN,isShutDown返回true;

    shutdownNow:尝试停止所有线程,返回等待执行的线程,线程池状态置为STOP,isShutDown返回true;

    当所有任务都关闭后,线程池才关闭成功,此时isTerminaed才返回true;

    合理配置线程池

    考虑已下方面:

    1. 任务性质:CPU密集(配置少量线程Cpu个数+1)、IO密集(设置多数线程2*Cpu个数)、混合型任务;

    2. 任务优先级:高中低,可使用优先队列处理;

    3. 任务执行时间:长中短,可由不同规模的线程池分开处理,或者使用优先队列,时间短的优先;

    4. 任务依赖性:如系统资源或数据库连接,应该设置多的线程,提高CPU利用率;

    线程池监控

    通过API获取线程池任务信息:已完成任务数、曾经创建过的最大线程数(可判断曾经是否满过)、线程池数量(不销毁只增不减)、活动线程数、需要执行的任务数;

    通过覆写方法:beforeExecute、afterExecute、terminated在任务执行前后执行其他动作,如统计线程运行时间;

    相关文章

      网友评论

          本文标题:9. Java中的线程池

          本文链接:https://www.haomeiwen.com/subject/qccanctx.html