当前位置: 首页 > news >正文

你对线程池的了解有多少?知道为什么阿里不让用Java提供的线程池吗?

微信搜索《Java鱼仔》,每天一个知识点不错过

(一)每天一个知识点

你对线程池的了解有多少?知道为什么阿里不让用Java提供的线程池吗?

(二)回答

2.1 什么是线程池

线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位,我们的程序最终都是由线程进行运作。在Java中,创建和销毁线程的动作是很消耗资源的,因此就出现了所谓“池化资源”技术。线程池是池化资源技术的一个应用,所谓线程池,顾名思义就是预先按某个规定创建若干个可执行线程放入一个容器中(线程池),需要使用的时候从线程池中去取,用完之后不销毁而是放回去,从而减少了线程创建和销毁的次数,达到节约资源的目的。

2.2 为什么要使用线程池

降低资源消耗

前面已经讲到线程池的出现减少了线程创建和销毁的次数,每个线程都可以被重复利用,可执行多个任务。

提高系统的响应速度

每当有任务到来时,直接复用线程池中的线程,而不需要等待新线程的创建,这个动作可以带来响应速度的提升

防止过多的线程搞坏系统

可以根据系统的承受能力,调整线程池中的工作线程的数量,防止因为线程过多服务器变慢或死机。java一个线程默认占用空间为1M,可以想象一旦手动创建线程过多极有可能导致内存溢出。

2.3 如何去创建线程池

JDK提供了四种标准的线程池:newSingleThreadExecutor、newFixedThreadPool、newCachedThreadPool、newScheduledThreadPool

使用这几种线程池只需要用Executors去调用线程池方法即可,调用方式如下:

ExecutorService executorService = Executors.newSingleThreadExecutor();

2.4 为什么阿里不让用Executors直接生成线程池

JDK提供的四个线程池底层采用的都是ThreadPoolExecutor来生成,因此为了让开发人员更加了解线程池的运行规则,阿里规约约定线程池的操作都需要手动去创建

ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.MILLISECONDS, blockingQueue, handler);

ThreadPoolExecutor有核心的七个参数,有关线程池更核心的知识与应用我写了一篇博客,点击下面查看。
面试官:不会真有人不知道什么是线程池吧?

相关文章:

  • Android音频底层调试-基于tinyalsa
  • 关于Java多线程锁的升级原理,这篇文章会让你另有收获
  • 关于动态代理,你能说出动态代理的几种方式?
  • WebKit 源码分析 -- loader
  • 反射的原理是什么,反射创建类实例的三种方式是什么?
  • linux编程获取本机网络相关参数
  • 【经验分享】工作中只需要增删改查的程序员,别安于现状
  • 一篇文章带你了解cloneable接口、浅拷贝、深拷贝
  • 愚人节的oschinese主页倾斜是这么搞的!
  • Mybatis从小白到小黑(一)Mybatis的原理介绍及超详细使用
  • 程序模块化的阶段性总结
  • 看完这篇类的实例化顺序,考执行顺序的面试题就难不倒你了
  • Mybatis从小白到小黑(二)Mybatis增删改查,这一篇足以
  • JVM的内存分代,这篇文章帮你理一理
  • 用python爬取亚马逊物品列表
  • @angular/forms 源码解析之双向绑定
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • [译]前端离线指南(上)
  • egg(89)--egg之redis的发布和订阅
  • httpie使用详解
  • Material Design
  • mysql innodb 索引使用指南
  • npx命令介绍
  • Spring Boot快速入门(一):Hello Spring Boot
  • Web标准制定过程
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 设计模式走一遍---观察者模式
  • 时间复杂度与空间复杂度分析
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 《码出高效》学习笔记与书中错误记录
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • #pragma data_seg 共享数据区(转)
  • #pragma pack(1)
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • (1)(1.11) SiK Radio v2(一)
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转)memcache、redis缓存
  • .net framework 4.0中如何 输出 form 的name属性。
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .NET框架
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • @EnableConfigurationProperties注解使用
  • [ solr入门 ] - 利用solrJ进行检索
  • [ vulhub漏洞复现篇 ] Apache APISIX 默认密钥漏洞 CVE-2020-13945
  • [20190416]完善shared latch测试脚本2.txt
  • [2023年]-hadoop面试真题(一)