线程池的拒绝策略

  • AbortPolicy:直接抛出异常阻止系统正常工作。
  • CallerRunsPolicy:只要线程池未关闭,该策略直接在调用者线程中,运行当前被丢弃的任务。
  • DiscardOldestPolicy:丢弃最老的一个请求,尝试再次提交当前任务。
  • DiscardPolicy:丢弃无法处理的任务,不给予任何处理。
  • 如果需要自定义拒绝策略可以实现RejectedExecutionHandler接口

如何使用好线程池

线程个数大小的设置

计算密集型

  • 顾名思义就是应用需要非常多的CPU计算资源,在多核CPU时代,我们要让每一个CPU核心都参与计算,将CPU的性能充分利用起来,这样才算是没有浪费服务器配置,如果在非常好的服务器配置上还运行着单线程程序那将是多么重大的浪费
  • 对于计算密集型的应用,完全是靠CPU的核数来工作,所以为了让它的优势完全发挥出来,避免过多的线程上下文切换,比较理想方案是: 线程数 = CPU核数+1,也可以设置成CPU核数*2,但还要看JDK的版本以及CPU配置(服务器的CPU有超线程)

IO密集型

  • 就很好理解了,我们现在做的开发大部分都是WEB应用,涉及到大量的网络传输,不仅如此,与数据库,与缓存间的交互也涉及到IO,一旦发生IO,线程就会处于等待状态,当IO结束,数据准备好后,线程才会继续执行
  • 因此从这里可以发现,对于IO密集型的应用,我们可以多设置一些线程池中线程的数量,这样就能让在等待IO的这段时间内,线程可以去做其它事,提高并发处理效率。那么这个线程池的数据量是不是可以随便设置呢?当然不是的,请一定要记得,线程上下文切换是有代价的
  • 目前总结了一套公式,对于IO密集型应用: 线程数 = CPU核心数/(1-阻塞系数) 这个阻塞系数一般为0.8~0.9之间,也可以取0.8或者0.9。 套用公式,对于双核CPU来说,它比较理想的线程数就是20,当然这都不是绝对的,需要根据实际情况以及实际业务来调整:final int poolSize = (int)(cpuCore/(1-0.9))

线程池相关参数配置

  • 使用线程池的时候都不要选择没有上限限制的配置项。 第一,我们不要去使用没有上限的线程池和设置无界队列! 比如,newCachedThreadPool的设置与无界队列的设置因为某些不可预期的情况,线程池会出现系统异常,导致线程暴增的情况或者任务队列不断膨胀,内存耗尽导致系统崩溃和异常。 我们推荐使用自定义线程池来避免该问题,这也是在使用线程池规范的首要原则
  • 合理设置线程数量、和线程空闲回收时间,根据具体的任务执行周期和时间去设定,避免频繁的回收和创建,虽然我们使用线程池的目的是为了提升系统性能和吞吐量,但是也要考虑下系统的稳定性,不然出现不可预期问题会很麻烦
  • 根据实际场景,选择适用于自己的拒绝策略。进行补偿,不要乱用JDK支持的自动补偿机制!尽量采用自定义的拒绝策略去进行兜底

利用Hook嵌入你的行为

  • 利用Hook,留下线程池执行轨迹: ThreadPoolExecutor提供了protected类型可以被覆盖的钩子方法,允许用户在任务执行之前和执行之后做一些事情。
  • 我们可以通过它来实现比如初始化ThreadLocal、收集统计信息、如记录日志等操作。这类Hook如beforeExecute和afterExecute。
  • 另外还有一个Hook可以用来在任务被执行完的时候让用户插入逻辑,如rerminated 。 如果hook方法执行失败,则内部的工作线程的执行将会失败或被中断

线程池的关闭

  • 内容当线程池不在被引用并且工作线程数为0的时候,线程池将被终止。我们也可以调用shutdown来手动终止线程池。如果我们忘记调用shutdown,为了让线程资源被释放,我们还可以使用keepAliveTime和allowCoreThreadTimeOut来达到目的! 当然,稳妥的方式是使用虚拟机Runtime.getRuntime().addShutdownHook方法,手工去调用线程池的关闭方法

Java 线程池相关问题相关推荐

  1. java线程池队列场景,Java面试题汇总

    01 并发宝典:面试专题 面试专题分为四个部分,分别如下 Synchronized 相关问题 可重入锁 ReentrantLock 及其他显式锁相关问题 Java 线程池相关问题 Java 内存模型相 ...

  2. java线程池笔记及相关代码

    java线程池笔记: 线程池好处: 重用存在的线程,减少对象创建.消亡的开销,性能佳. 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞. 提供定时执行.定期执行.单线程 ...

  3. Java线程池实现原理及其在美团业务中的实践

    来自:美团技术团队 随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流.使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器.J.U.C提供的线程池ThreadPoolExecuto ...

  4. 深入了解java线程池

    在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统 ...

  5. Java线程池了解一下

    前言 马上就要过年了,还在岗位上坚守"swimming"的小伙伴们顶住.博主给大家带来一篇线程池的基本使用解解闷. 为什么需要使用线程池 1.减少线程创建与切换的开销 在没有使用线 ...

  6. JAVA线程池管理及分布式HADOOP调度框架搭建

    平时的开发中线程是个少不了的东西,比如tomcat里的servlet就是线程,没有线程我们如何提供多用户访问呢?不过很多刚开始接触线程的开发攻城师却在这个上面吃了不少苦头.怎么做一套简便的线程开发模式 ...

  7. JAVA线程池原理以及几种线程池类型介绍

    在什么情况下使用线程池? 1.单个任务处理的时间比较短      2.将需处理的任务的数量大 使用线程池的好处: 1.减少在创建和销毁线程上所花的时间以及系统资源的开销      2.如不使用线程池, ...

  8. 写的很好!细数 Java 线程池的原理

    今天我们就来详细讲解一下Java的线程池,首先我们从最核心的ThreadPoolExecutor类中的方法讲起,然后再讲述它的实现原理,接着给出了它的使用示例,最后讨论了一下如何合理配置线程池的大小. ...

  9. Java 线程池中的线程复用是如何实现的?

    前几天,技术群里有个群友问了一个关于线程池的问题,内容如图所示: 关于线程池相关知识可以先看下这篇:为什么阿里巴巴Java开发手册中强制要求线程池不允许使用Executors创建? 那么就来和大家探讨 ...

最新文章

  1. SQL Server 日期和时间相关的数据类型有两种
  2. android手机装windows,安卓手机上运行WindowsXP系统图文教程
  3. jQuery源码解析对象实例化与jQuery原型及整体构建模型分析(一)
  4. SpringBoot中使用FastJson解析Json数据
  5. python创建excel_python创建Excel文件数据的方法
  6. 【好文】为什么必须学好.Net Core?怎样弯道超车新年高薪?这样做,一周就够了!(文末彩蛋)...
  7. alonedb.php on line 58,SHOPEX出现\core\include_v5\AloneDB.php on line 58的解决办法
  8. firefox伪造请求头信息,模拟手机访问网站
  9. HTML5 Geolocation(地理定位)
  10. 毕业设计-基于Javaweb实现超市管理系统
  11. html5 播放器 github,GitHub - Little-girl-lily/player: html5版本音乐播放器,支持iOS设备...
  12. 推荐一个在Windows下可以查看文件夹大小的工具TreeSize Free
  13. Mac系统 wps/word和endnote关联,导入参考文献
  14. 模电:集成运算放大器
  15. Alibaba微服务组件Nacos单机+集群配置 prometheus+grafana监控配置及注册中心实战【收获满满】
  16. 阿里云携手开源中国众包平台发布百万悬赏项目
  17. keychron的机械键盘
  18. IE 打开速度慢的解决方法
  19. 6款经典BI项目报表表单风格配色方案
  20. 专硕的好消息!北京要大力发展专硕,新增硕士专硕为主!

热门文章

  1. 狼人杀服务器紧急维护中,狼人杀最可怕的武器是那张嘴?禁言长老:你已被管理员禁言一天!...
  2. 【转】Git Shell 基本命令(官网脱水版)
  3. java 不识别enum_Java enum关键字不识别的快速解决办法
  4. Python3 基础学习笔记 C09【文件和异常】
  5. mysql一个事务多个log_MySQL识别一个binlog中的一个事物
  6. 【Codeforces - 977D】Divide by three, multiply by two(思维构造)
  7. 【牛客 - 370B】Rinne Loves Graph(分层图最短路 或 最短路dp)
  8. 【CodeForces-1041C】Coffee Break(贪心,STL,set二分维护,题意难,有坑,SJ题,构造)(知识点总结)
  9. android和ios系统的内存,WP和Saipan系统的流畅程度相当于ios,占用的内存很少,但是为什么要用Android取代它...
  10. python数字类型怎么学,python的数字类型学习之数据类型