探索JAVA并发 - 线程池详解
Posted 架构师社区
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了探索JAVA并发 - 线程池详解相关的知识,希望对你有一定的参考价值。
线程池是并发编程中必不可少的一种工具,也是面试高频话题。
-
线程复用:线程池中的线程是可以复用的,省去了创建、销毁线程的开销,提高了资源利用率(创建、销毁等操作都是要消耗系统资源的)和响应速度(任务提交过来线程已存在就不用等待线程创建了); -
合理利用资源:通过调整线程池大小,让所有处理器尽量保持忙碌,又能防止过多线程产生过多竞争浪费资源;
Executor框架
在JAVA中,任务执行的主要抽象不是Thread,而是Executor。Executor基于生产者-消费者模式,提交任务的操作相当于生产者,执行任务的线程相当于消费者。
|
|
Executors与常用线程池
Executors其实就是Executor(加s)
-
newFixedThreadPool 固定长度线程池,每次提交任务都会创建一个新线程,直到线程数量达到指定阈值则不再创建新的; -
newCachedThreadPool 可缓存线程池,每次提交任务都会创建一个新线程(理论上无限制),部分任务执行完后如果没有新的任务,导致某些线程无用武之地,它们将被终结; -
newSingleThreadExecutor 只有一个线程的线程池; -
newScheduledThreadPool 可以延时或者定时执行任务的线程池。
|
|
线程池构造参数
-
int corePoolSize : 核心线程数,有新任务来时,如果当前线程小于核心线程,则新建一个线程来执行该任务 -
int maximumPoolSize : 最大线程数,线程池最多拥有的线程数 -
long keepAliveTime : 空闲线程存活时间 -
TimeUnit unit : 空闲线程存活时间的单位 -
BlockingQueue workQueue : 存放待执行任务的阻塞队列,新任务来时,若当前线程数>=最大核心线程数,则放到这个队列 -
ThreadFactory threadFactory : 创建新线程的工厂,一般用来给线程取个名字方便排查问题 -
RejectedExecutionHandler handler : 任务被拒绝后的处理器,默认的处理器会直接抛出异常,建议重新实现
|
|
线程池创建示例
|
|
有返回值的提交方式
submit
|
|
submit Callable
|
|
submit实现原理
|
|
关闭线程池
-
如果线程池里的线程一直存活,而且这些线程又不是守护线程,那么会导致虚拟机无法正常退出; -
如果直接粗暴地结束应用,线程池中的任务可能没执行完,业务将处于未知状态; -
线程中有些该释放的资源没有被释放。
-
shutdown 停止接收新任务(继续提交会被拒绝,执行拒绝策略),但已提交的任务会继续执行,全部完成后线程池彻底关闭; -
shutdownNow 立即停止线程池,并尝试终止正在进行的线程(通过中断),返回没执行的任务集合; -
awaitTermination 阻塞当前线程,直到全部任务执行完,或者等待超时,或者被中断。
|
|
扩展线程池
总结
长按订阅更多精彩▼
如有收获,点个在看,诚挚感谢
以上是关于探索JAVA并发 - 线程池详解的主要内容,如果未能解决你的问题,请参考以下文章