美文网首页
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中的线程池

    使用线程池的好处 降低资源消耗:重复利用线程,降低创建和销毁的消耗; 提高响应速度:任务到达时可马上执行,不需要等...

  • 19. 线程池

    Android 中的线程池就是 java 中的线程池,即 ThreadPoolExecutor 类。 Java 通...

  • Android 线程池的封装

    GlobalThreadPools.java: 调用: 线程池线程池概念来源于Java中的Executor,它是一...

  • Java线程池总结

    本篇文章讲述Java中的线程池问题,同样适用于Android中的线程池使用。本篇文章参考:Java线程池分析,Ja...

  • Java线程池详解

    本篇文章讲述Java中的线程池问题,同样适用于Android中的线程池使用。本篇文章参考:Java线程池分析,Ja...

  • Java线程池解析

    参考文章:Java并发:线程池,饱和策略 前言 Java线程池的使用在工作中还是比较常见的,线程池可以减小线程建立...

  • ThreadPoolExecutor的用法

    Java中的线程池 一般我们说起Java中的线程池,其实指的是java.util.concurrent包下的Thr...

  • Android中线程池的使用分析

    引言:说起线程池,学习过Java基础的同学估计都不陌生,Android中的线程池其实就是java的线程池。那么为什...

  • Java多线程之线程池深入讲解

    1 线程池介绍 1.1 线程池概念 Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Jav...

  • Java并发

    一、线程池 线程池:事先将多个线程放到容器中,用的时候不用New线程,直接从池中获取。 Java中的线程池有: 1...

网友评论

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

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