在高并发场景下,如果每一个请求或人物都开启一个线程,系统要不断的进行线程的创建、销毁,会消耗大量的系统性能,而线程的数量到达一个临界值时,系统会受到进一步更大的影响,这时候就需要用到线程池。

ThreadPoolExecutor线程池的类关系

Executor的定义是An Object that executes submitted tasks,即接口的实现是一个“执行提交任务”的对象,接口提供了一个将“任务提交”和“执行机制”分离的方法,包括线程使用详情,调度等。总之是提供了一个提交Runnable任务的接口。

ExecutorService接口继承子Executor,提供了任务提交,执行,线程控制的一系列方法。

AbstractExecutorService是ExecutorService的默认实现,提供了任务提交,管理的默认实现。

ThreadPoolExecutor继承自AbstractExecutorService,是线程池的真正实现,通过构造方法的参数来配置生成不同的线程池,构造方法有:

public ThreadPoolExecutor(int corePoolSize,

int maximumPoolSize,

long keepAliveTime,

TimeUnit unit,

BlockingQueue<Runnable> workQueue);

public ThreadPoolExecutor(int corePoolSize,

int maximumPoolSize,

long keepAliveTime,

TimeUnit unit,

BlockingQueue<Runnable> workQueue,

ThreadFactory threadFactory) ;

public ThreadPoolExecutor(int corePoolSize,

int maximumPoolSize,

long keepAliveTime,

TimeUnit unit,

BlockingQueue<Runnable> workQueue,

RejectedExecutionHandler handler);

public ThreadPoolExecutor(int corePoolSize,

int maximumPoolSize,

long keepAliveTime,

TimeUnit unit,

BlockingQueue<Runnable> workQueue,

ThreadFactory threadFactory,

RejectedExecutionHandler handler);

构造方法参数说明

1) corePoolSize,核心线程数,通常情况下会一直存活,不会受keepAliveTime的控制,即使是idle的空闲状态,除非设置

allowCoreThreadTimeOut为true。

2)maximumPoolSize,线程池最大线程数,线程池线程数达到这个数字,创建想成会被阻塞。任务队列为没有设置大小的LinkedBlockingDeque时,配置无效。

3)keepAliveTime,非核心且idle(空闲)状态的线程存活时间,超过这个时间就会被回收。

4)unit,keepAliveTime时间的单位

5)workQueue,线程池的任务队列,常用的任务队列有SynchronousQueue,LinkedBlockingDeque,ArrayBlockingQueue

6)threadFactory,线程创建工厂,用于创建新线程,定制个性化线程参数,一般使用DefaultThreadFactory 默认实现

7)RejectedExecutionHandler ,线程池的资源已全部被使用,添加线程失败后,执行rejectedExecution方法

线程池创建参数配置

当线程池任务队列无限大时

  • 如果线程数量<=核心线程数量,那么直接启动一个核心线程来执行任务,不会放入队列中。
  • 如果线程数量>核心线程数,但<=最大线程数,并且任务队列是LinkedBlockingDeque的时候,超过核心线程数量的任务会放在任务队列中排队。
  • 如果线程数量>核心线程数,但<=最大线程数,并且任务队列是SynchronousQueue的时候,线程池会创建新线程执行任务,这些任务也不会被放在任务队列中。这些线程属于非核心线程,在任务完成后,闲置时间达到了超时时间就会被清除。
  • 如果线程数量>核心线程数,并且>最大线程数,当任务队列是LinkedBlockingDeque,会将超过核心线程的任务放在任务队列中排队。也就是当任务队列是LinkedBlockingDeque并且没有大小限制时,线程池的最大线程数设置是无效的,他的线程数最多不会超过核心线程数。
  • 如果线程数量>核心线程数,并且>最大线程数,当任务队列是SynchronousQueue的时候,会因为线程池拒绝添加任务而抛出异常。

当线程池任务队列有大小限制时

  • 当LinkedBlockingDeque塞满时,新增的任务会直接创建新线程来执行,当创建的线程数量超过最大线程数量时会抛异常。
  • SynchronousQueue没有数量限制。因为他根本不保持这些任务,而是直接交给线程池去执行。当任务数量超过最大线程数时会直接抛异常。

Executors线程池工厂、工具类提供了一些个性化的线程池配置,如:

newFixedThreadPool(int nThreads)

ExecutorService newSingleThreadExecutor()

ExecutorService newCachedThreadPool()

ScheduledExecutorService newScheduledThreadPool(int corePoolSize, ThreadFactory threadFactory)

  • newFixedThreadPool,可重用、固定线程的线程池,基于共享的、无限的队列,在任何时候,线程都是活动状态,且可以处理任务,如果在所有线程都是活动状态时提交任务,任务将缓存在任务队列中等待,知道线程空闲下来,如果由于执行期间线程挂掉,将会创建新的线程执行任务。
  • newSingleThreadExecutor,只有一个线程的线程池,基于无限队列,独苗线程挂掉后会重新创建,保证任务按照顺序执行,在任何给定时间,不会有多个任务处于活动状态
  • newCachedThreadPool,根据需要创建新线程的线程池,但是线程可以重用,通常用于执行许多短期异步任务, 如果没有现有线程可用,则为新线程将创建线程并将其添加到池中。 线程未使用60秒将被终止并从中删除缓存。
  • newScheduledThreadPool,延迟执行或定时执行任务的线程池。

(完)

Java-Concurrent 线程池ThreadPoolExecutor使用相关推荐

  1. Java并发—线程池ThreadPoolExecutor基本总结

    原文作者:Matrix海子 原文地址:Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线 ...

  2. java线程池1001java线程池_深入浅出Java(Android )线程池ThreadPoolExecutor

    前言 关于线程池 在Java/Android开发中,设计到并发的请求,那基本上是离不开线程池了.用线程池的好处: 1.减少线程频繁创建.销毁的开销: 2.好控制并发量,降低OOM的可能,至于原因文中会 ...

  3. Java中线程池ThreadPoolExecutor原理探究

    一. 前言 线程池主要解决两个问题:一方面当执行大量异步任务时候线程池能够提供较好的性能,这是因为使用线程池可以使每个任务的调用开销减少(因为线程池线程是可以复用的).另一方面线程池提供了一种资源限制 ...

  4. Java多线程- 线程池的基本使用和执行流程分析 - ThreadPoolExecutor

    线程池的实现原理 池化技术 一说到线程池自然就会想到池化技术. 其实所谓池化技术,就是把一些能够复用的东西放到池中,避免重复创建.销毁的开销,从而极大提高性能. 常见池化技术的例如: 线程池 内存池 ...

  5. Java线程池ThreadPoolExecutor的实例

    Java.util中的线程池和Spring框架对这个类的扩展 1.单独通过java里的ThreadPoolExecutor这个类,可以创建线程池,如果系统采用Spring框架设计,可以采用Thread ...

  6. Java线程池—ThreadPoolExecutor

    2019独角兽企业重金招聘Python工程师标准>>> 为什么要使用线程池创建线程?     使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开销,解决资源不足的问题 ...

  7. Java 线程池 ThreadPoolExecutor 八种拒绝策略浅析

    前言 谈到 Java 的线程池最熟悉的莫过于 ExecutorService 接口了,jdk1.5 新增的 java.util.concurrent 包下的这个 api,大大的简化了多线程代码的开发. ...

  8. java 线程池ThreadPoolExecutor

    线程池 线程池的作用: 线程池作用就是限制系统中执行线程的数量. 根 据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果:少了浪费了系统资源,多了造成系统拥挤效率不高.用线程池控制线程数 ...

  9. Java线程池ThreadPoolExecutor使用和分析

    Java线程池ThreadPoolExecutor使用和分析(一) Java线程池ThreadPoolExecutor使用和分析(二) Java线程池ThreadPoolExecutor使用和分析(三 ...

  10. java线程池执行器_Java线程池ThreadPoolExecutor的使用

    Java线程池ThreadPoolExecutor的使用 ThreadPoolExecutor就是我们用来实现线程的一个执行器,它实现了Excutor和ExecutorService接口.Excuto ...

最新文章

  1. 大一计算机在线考试,Word 大一计算机考试操作题
  2. linux 网卡流量脚本,每5分钟统计Linux 网卡流量的脚本
  3. 斐波纳契数列递归和非递归算法
  4. 苹果如何不显示云服务器照片,苹果云端照片怎么恢复到相册-互盾苹果恢复精灵...
  5. 面试题17. 打印从1到最大的n位数
  6. Linux6新建分区,centos6中添加一块新的硬盘并分区的方法介绍
  7. 考研数据库系统概论题目整理
  8. java微信聊天机器人源码_三步轻松打造微信聊天机器人(附源码)
  9. html5怎么把表格边框设为0,css表格边框怎么设置
  10. HUAWEI 机试题:最长元音字串的长度
  11. 杭州辣府餐饮JAVA_超全“滨江美食必打卡list”,不收藏会后悔!年前再去搓几顿啊~...
  12. Java 实验8 《抽象类与接口》
  13. 最优化理论笔记及期末复习(《数值最优化》——高立)
  14. 使用docker部署ETH区块链浏览器
  15. 关于我对体测成绩进行分析这件事
  16. 运行代码时输出“1.#INF00”和“1.$”是什么情况
  17. 联想G480安装固态硬盘过程
  18. 给tr标签设置外边距
  19. Mac多格式媒体播放器:Infuse
  20. 元素之歌鸿蒙怎么合成,鸿蒙「3.4 熟知的列表」闯荡HAP之单-列表和组装列表

热门文章

  1. DotNet 学习笔记
  2. BCD码和十六进制的区别【转】
  3. Java代码有效和片段有效_Java 9 尝鲜之交互式编程环境
  4. 空值替换为0_Excel查找、替换和定位
  5. python3的xpath_python3爬虫之xpath
  6. enityframework 已连接的当前状态为打开。_关于性能优化 从tcp建立连接amp;断开的视角...
  7. flask如何查询mysql_bootstrap+flask+mysql实现网站查询
  8. 加载geojson面数据_地理数据可视化
  9. 设计趋势:液态渐变色彩背景
  10. 电商促销类插画素材,适合各种活动banner设计