线程池的作用及优势

线程池做的工作主要是控制运行的线程的数量,处理过程中将任务加入队列,然后在线程创建后启动这些任务,如果提交的任务超过了线程能执行的最大数量,超出的数量的任务会被提交到一个阻塞队列排队等候,等其他线程执行完毕,再从队列中取出任务来执行.

主要特点为:线程复用:控制最大并发数:管理线程.

第一:降低资源消耗.通过重复利用自己创建的线程降低线程创建和销毁造成的消耗.
第二: 提高响应速度.当任务到达时,任务可以不需要等到线程创建就能立即执行.
第三: 提高线程的可管理性.线程是稀缺资源,如果无限的创建,不仅会消耗资源,还会降低系统的稳定性,使用线程池可以进行统一分配,调优和监控.

线程池的种类

JAVA8中JDK有5种定义好的线程池,分别是:

FixedThreadPool: 创建一个定长线程池,可控制线程的最大并发数,超出的线程会在队列中等待,newFixedThreadPool创建的线程池corePoolSize和MaxmumPoolSize是相等的,它使用的任务队列是LinkedBlockingQueue。

SingleThreadPool:创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务都按照指定顺序执行。newSingleThreadExecutor将corePoolSize和MaxmumPoolSize都设置为1,它使用的任务队列是LinkedBlockingQueue。

CacheThreadPool:创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则创建新线程。newCachedThreadPool将corePoolSize设置为0,MaxmumPoolSize设置为Integer.MAX_VALUE,它使用的是SynchronousQUeue,也就是说来了任务就创建线程运行,如果线程空闲超过60秒,就销毁线程。

ScheduledThreadPool:创建一个可以按时间周期执行任务的线程池,使用的任务队列是DelayedWorkQueue。

WorkStealingPool:java8新增,使用目前机器上可以的处理器作为他的并行级别。

以上五种线程池都可以使用Executors来创建:

ps:JDK已经定义好的线程池存在一些问题,例如:

这里指定的任务队列并没有指定其队列容量,直接new会创建一个容量默认的阻塞队列:

队列长度是Integer.MAX_VALUE,这个长度是2^31

由于队列的容量几乎为无界,所以可能会致使任务大量堆积,从而OOM。在使用线程池时,最好使用ThreadPoolExecutor的构造函数来创建。

创建线程池的参数

 public ThreadPoolExecutor( //线程池中的常驻核心线程数int corePoolSize,//线程池能够容纳同时执行的最大线程数,此值大于等于1int maximumPoolSize,//多余的空闲线程存活时间,当空间时间达到keepAliveTime值时,多余的线程会被销毁直到只剩下corePoolSize个线程为止long keepAliveTime,//keepAliveTime的单位TimeUnit unit,// 任务队列,被提交但尚未被执行的任务.BlockingQueue<Runnable> workQueue,// 表示生成线程池中工作线程的线程工厂,用户创建新线程,一般用默认即可ThreadFactory threadFactory,// 拒绝策略,表示当线程队列满了并且工作线程大于等于线程池的最大显示 数(maxnumPoolSize)时如何来拒绝.RejectedExecutionHandler handler) {...

总共有7个参数,其中corePoolSize的含义是:1.在创建了线程池后,当有请求任务来之后,就会安排池中的线程去执行请求任务,可以理解为最少存在的线程数。
2.当线程池中的线程数目达到corePoolSize后,就会把到达的任务放入到缓存队列当中。而keepAliveTime是指多余的空闲线程存活时间,当空间时间达到keepAliveTime值时,多余的线程会被销毁直到只剩下corePoolSize个线程为止。

线程池的拒绝策略

线程池拒绝策略也就是上面参数中的RejectedExecutionHandler,线程池有4种拒绝策略,它们都是RejectedExecutionHandler接口的实现类。

AbortPolicy:直接抛出异常。

CallerRunsPolicy:将任务返回给调用者所在线程来运行任务。

DiscardOldestPolicy:丢弃队列里等待最久的一个任务,并执行当前任务。

DiscardPolicy:不处理,丢弃掉。

通过实现RejectedExecutionHandler接口可以自定义拒绝策略,但是拒绝策略是一种处理较为极端的情况的方式,正常情况下尽量通过合理的设计线程池来防止溢出。

线程池的工作流程

画了个简单的示意图:

线程池参数详解及其工作原理相关推荐

  1. Java线程池参数详解

    1:前言 在使用线程池时,为了获取最佳的性能,常常需要手动指定线程池的参数,ThreadPoolExecutor是最常用的线程池执行器,它有四个构造方法,参数最多的构造方法有7个参数,下面将详细介绍这 ...

  2. 线程池参数详解_java中常见的六种线程池详解

    之前我们介绍了线程池的四种拒绝策略,了解了线程池参数的含义,那么今天我们来聊聊Java 中常见的几种线程池,以及在jdk7 加入的 ForkJoin 新型线程池 首先我们列出Java 中的六种线程池如 ...

  3. 线程池源代码详解,参数详解

    线程池源代码详解,参数详解 ThreadPoolExecutor 构造函数源代码 public ThreadPoolExecutor(int corePoolSize, int maximumPool ...

  4. Java线程池ThreadPool详解

    Java线程池ThreadPool详解 1. 线程池概述 1.1 线程池简介 1.2 线程池特点 1.3 线程池解决问题 2. 线程池原理分析 2.1 线程池总体设计 2.6 线程池流转状态 2.2 ...

  5. async spring 默认线程池_Spring boot注解@Async线程池实例详解

    这篇文章主要介绍了Spring boot注解@Async线程池实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 从Spring3开始提供了@A ...

  6. 【转详解步进电机工作原理】

    详解步进电机工作原理[转自知乎gk-auto] 步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件.在非超载的情况下,电机的转速.停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响, ...

  7. 详解帧中继工作原理及作用

    详解帧中继工作原理及作用 帧中继特点 帧中继工作原理 帧中继的作用 帧中继习题 帧中继(FrameRelay)是一种用于连接计算机系统的面向分组的通信方法.它主要用在公共或专用网上的局域网互联以及广域 ...

  8. 线程池ThreadPoolExecutor详解(整理详细)

    ThreadPoolExecutor 1.什么是线程池? (首先要理解什么是线程) 线程池,thread pool,是一种线程使用模式,线程池维护着多个线程,等待着监督管理者分配可并发执行的任务. 通 ...

  9. 线程池(ThreadPoolExecutor)详解

    线程池 线程池 线程池种类: ThreadPoolExecuter 类关系 结构 自定义线程池参数: 线程池的大小(maximumPoolSize): JDK提供的线程池 singleThreadPo ...

最新文章

  1. 工作中5个实用的Linux命令
  2. 2018-01-02 JavaScript实现ZLOGO: 用语法树实现多层循环...
  3. C++调用matlab编程
  4. 耗时1周!精选22G超超超适合产品经理的《数据分析》学习资源,抓紧保存!限时2天删除~...
  5. Unity Standard Assets Example Project
  6. Win7系统主题路径
  7. 从你王者荣耀爱玩的英雄类型,我就知道你关注哪些技术领域!
  8. shell中find详解
  9. 【POJ 3469】Dual Core CPU【最小割】
  10. matlab中unique的作用,matlab中的unique函数详解
  11. C#编写CPU压力测试程序
  12. Visual C++课程设计选题
  13. 记一次跟二房东公司(非中介个人房源无中介费)租房的经历
  14. 隔离DCDC电源模块和非隔离DCDC电源模块不同之处
  15. [转载]网络数据流的java处理
  16. 转: 网页设计中的一些色彩搭配技巧
  17. 大数据技术会偷看我们的邮件?
  18. jdk小工具jps介绍 - Sky's blog - BlogJava
  19. Linux配置通过qq邮件服务器发送邮件
  20. class-validator中文教程

热门文章

  1. 小米拒绝权限_小米隐私保护,真的很用心!应用行为记录,大大点个赞!
  2. 计算机绘图电脑配置要求,【2人回答】CAD对电脑配置有什么要求?-3D溜溜网
  3. 《爱我的人和我爱的人》--游鸿明
  4. 耗纸古风古文之六--酹稼轩
  5. 自建CDN加速平台CDNPlus正式开放 – 快速拥有自己的CDN
  6. 电信宽带没有路由器也能上无线网
  7. 趣头条短视频伪原创技巧
  8. 金蝶K3 Cloud APi接口说明书
  9. #发现好游戏——Unheard
  10. 蓝牙DA14580学习教程(附开源可编程手环/手表全套学习资料下载地址)