Java 线程池相关问题

线程池的拒绝策略

  • 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,为了让线程资源被释放,我们还可以使用keepAliveTimeallowCoreThreadTimeOut来达到目的! 当然,稳妥的方式是使用虚拟机Runtime.getRuntime().addShutdownHook方法,手工去调用线程池的关闭方法

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/447290.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对编程人员我想说:多做 多实践 多写代码

有很多人问我,怎样提高自己的能力?有初学者,有水平达到一定程度的程序员。 我想说,不要过多的看代码,看计算机理论,看别人写的文章,代码等,最重要的是自己理解了某个原理&#xff0c…

读人是基础,看人是关键,做人最重要

人生在世,读人是基础,看人是关键,做人最重要。 一、读人——一个人就是一本书。读人,比读其他文字的书更难。在生活中,每个人都是书,每人又都是读者。我们认认真真地读,读了大半辈子&#xff0c…

使用postman模拟百度通用文字识别

1,登录百度AI开放平台 百度AI网站新手指南链接在顶部导航栏中,找到控制台选项,输入账号和密码,进入管理中心页面在管理中心页面中,找到文字识别的选项找到创建应用的选项,进行ocr项目的创建需要输入应用的…

3个观念 不再瞎学习!

此刻,你应该要做什么准备?加码股市还是追逐房市?都不是。在你分配时间、资源的投资组合里,有没有这一项:“自己”? 没有人会否认充实自我的重要,但是经历一场金融风暴大震撼,当企业…

Java调用百度OCR文字识别的接口

调用百度OCR文字识别的接口,来自于百度官网,亲测可以使用 跳转链接FileUtil的下载链接Base64Util下载链接HttpUtil下载链接GsonUtils下载链接Accurate.java文件 package com.baidu.ai.aip;import com.baidu.ai.aip.utils.Base64Util; import com.baidu.…

做好7步 迅速成为行业专家

行行出状元,但不一定人人能成为行业专家或权威。无论是做独立顾问,还是手下有250名员工的工厂主管,都是在用自己多年丰富经验在帮助企业成功。既然有了专业知识和经验,为什么不把它最大化利用,来建立自己的行业权威&am…

redis常用命令与特性

keys * 返回满足条件的所有key,可以模糊匹配select 数字0-15,进行数据库切换,默认0-15个exists 是否存在指定的keypersist 取消过期时间 select 选择数据库 (0-15,总共16个数据库)move key index 将当前数据…

紧急不代表重要:管理时间的六个秘密

当整个世界都永远在跟集中精神做事做对的时候,怎么办?Managershare:“世界上效率最高的程序员有什么相同之处?不是经验,薪水或者花在一个项目上的时间,而是他们的老板创造了一个免于走神的环境。”这老板太…

redis安全

定期打补丁禁止一些高危命令 (flushdb、keys *、flushall)以低权限运行 Redis 服务禁止外网访问 Redis设置访问密码 足够复杂,防止暴力破解 requirepass xxxxxxxx访问权限 内网通过acl限制可以访问redis的ip和端口

如何在三个月内获得三年的工作经验

在多年的工作生涯中,总会目睹一批人的升职像火箭速度一样。 而总有一批人,就像蜗牛一样,工作岗位和职位几乎从来不变。 我们看看,2个名人的快速成长史。 一个是教英语的李阳,他读大学时成绩不好,英语不…

Redis Cluster集群模式

Redis Cluster 它是Redis的分布式解决方案,在Redis 3.0版本正式推出的,有效解决了Redis分布式方面的需求。当遇到单机内存、并发、流量等瓶颈时,可以采用Cluster架构达到负载均衡的目的。数据分布理论: 分布式数据库首要解决把整个数据集按照…

永远和靠谱的人在一起!

巴菲特每年都会同大学生进行座谈,在一次交流会上,有学生问他:您认为一个人最重要的品质是什么?巴菲特没有正面回答这个问题,而是讲了一个小游戏,名为:买进你同学的10%。 巴菲特说:现在给你们一…

Redis事务详解

传统事务的特性 原子性一致性隔离性:事务之间互不干扰持久化:一旦事务提交,无法修改 Redis事务机制 MULTI、EXEC、DISCARD和WATCH命令是Redis事务功能的基础。Redis事务允许在一次单独的步骤中执行一组命令,并且可以保证如下两个…

工作的最终目的

当时公司招了大批应届本科和研究生毕业的新新人类。平均年龄25岁。那个新的助理,是经过多次面试后,我亲自招回来的一个女孩。名牌大学本科毕业,聪明,性格活泼。私下里我得承认,我招她的一个很重要的原因,除…

销售员所做的一切工作最终目的就是为了成交

(1)最后一次报价禁忌.报价过晚或者过于匆忙步幅度太大,显得过于慷慨;让步幅度太小,显得毫无意义当谈判进展到最后,双方只是在最后的某一两个问题上尚有不同意见,过让步才能求得一致,签订协议。在…

Redis java客户端操作

jedis jedis官方指定的redis java客户端&#xff0c;将其导入到pom.xml问价内 <!-- https://mvnrepository.com/artifact/redis.clients/jedis --> <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><vers…

HEVC/H265 namespace 介绍

在 HEVC/H265 代码中&#xff0c;有三个使用的namespace&#xff1a; 1. df 2. df::program_options_lite 3. RasterAddress 对于第一个 df 的namespace&#xff0c;我一直百思不得其解&#xff0c;df 是什么含义&#xff1f;老外对起名是很重视的&#xff0c;肯定有原因。…

Redis整合Springboot实现数据共享

代码的整体结构 RedisSessionConfig.java package com.cc.springbootredissession.config;import org.springframework.context.annotation.Configuration; import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;Configuration E…

人生什么最重要

什么最重要 20岁的人说,学习成绩最重要.一次考试分数,可以把人分为三六九等.&#xff02;博士&#xff02;,&#xff02;本科&#xff02;,&#xff02;大专&#xff02;&#xff02;高职&#xff02;&#xff02;中专&#xff02;,成绩好的上好学校,成绩差的上差学校;成绩好的…

Redis整合Springboot实现单机配置

整体结构 配置文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/…