FixedThreadPool vs CachedThreadPool

本贴最后更新于 2047 天前,其中的信息可能已经时过境迁

之前写了一篇文章关于四种线程池的解析。
但是对于 FixedThreadPool 与 CachedThreadPool 适用的场景其实还是比较模糊难以界定的。所以笔者今天通过设计大任务并发和小任务并发来验证 FixedThreadPool 与 CachedThreadPool 的适用场景。

首先我设计了一个任务基类,它通过计算圆周率来模拟 cpu 的密集计算、通过写日志到本地文件来模拟 IO。
这两个方法都通过参数 n 来调整任务的大小规模。

public class Task { /** * 通过计算圆周率模拟cpu计算 * 通过公式 π=4*(1-1/3+1/5-1/7+1/9-1/11+....) * * @return */ public static double calculatePI(long n) { double item = 0.0; double sum = 0; int flag = -1; for (int i = 0; i <= n; i++) { flag *= -1; item = flag * 1.0 / (2 * i + 1); sum += item; } return sum * 4; } /** * 通过写日志模拟IO操作 * @param n */ public static void writeIO(int n) { try { Date date = new Date(); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss-SSS"); String fileName = Thread.currentThread().getName() + "-" + format.format(date) + ".log"; FileOutputStream os = new FileOutputStream("C:\\Users\\valarchie\\Desktop\\logs\\" + fileName); for (int i = 0; i < n; i++) { os.write(("写入日志" + i + "次").getBytes()); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }

在笔者的设计当中大任务的规模是小任务的 10 倍,具体请看代码:

大任务

public class BigTask extends Task implements Runnable { private CountDownLatch latch; public BigTask(CountDownLatch latch) { this.latch = latch; } public static double calculatePI() { return calculatePI(100000000); } public static void writeIO() { writeIO(100); } @Override public void run() { calculatePI(); writeIO(); latch.countDown(); } }

小任务:

public class SmallTask extends Task implements Runnable { private CountDownLatch latch; public SmallTask(CountDownLatch latch) { this.latch = latch; } public static double calculatePI() { return calculatePI(10000000); } public static void writeIO() { writeIO(10); } @Override public void run() { calculatePI(); writeIO(); latch.countDown(); } }

通过测试我们得出一个小任务的运行时间大概在 86ms 左右。一个大任务的运行时间大概在 575ms 左右。
接下来我们分别测试 100 个大任务和 100 个小任务分别在单线程、FixedThreadPool、CachedThreadPool 三种情况下的运行时间(我的笔记本是 4 核的,经过简单测试 FixedThreadPool 在 16 线程数的情况下性能最优良)。

我们使用 CountDownLatch 的计算多线程的运行时间,以下是多线程的测试代码模板:

public static void main(String[] args) { int taskCount = 100; CountDownLatch latch = new CountDownLatch(taskCount); ExecutorService executorService = Executors.newFixedThreadPool(16); long t1 = System.currentTimeMillis(); for (int i = 0; i < taskCount; i++) { executorService.submit(new SmallTask(latch)); } try { latch.await(); } catch (InterruptedException e) { e.printStackTrace(); } long t2 = System.currentTimeMillis(); // 得出多线程的运行时间 System.out.println(t2 - t1); executorService.shutdown(); }
任务模型*100 单线程 FixedThreadPool CachedThreadPool
大任务 45067ms 6613ms 6224ms
小任务 4754ms 722ms 726ms

通过统计发现多线程的性能比单线程的性能优异很多,但是其实 FixedThreadPool 和 CachedThreadPool 的性能差异是差不多相等的并没有比较大差别。

为了更严谨一点,我们控制任务方法的规模和任务数量的规模再进行一次测试

任务模型*100 FixedThreadPool CachedThreadPool
大任务方法规模*10 78738ms 79669ms
大任务数量规模*10 73654ms 69343ms

结果发现其实性能上还是没有差异。

笔者经过验证得出的结论是两种线程池其实在性能上没有非常大差别,但是 FixedThreadPool 可以控制线程的并发数量,而 CachedThreadPool 不能控制线程的并发数量。如果线程数量爆发增长的话对系统会带来危害。个人认为使用 FixedThreadPool 会更好。

笔者认知水平有限,如有错误恳请评论区指正。
  • 线程
    123 引用 • 111 回帖 • 3 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    151 引用 • 257 回帖 • 1 关注
  • Scala

    Scala 是一门多范式的编程语言,集成面向对象编程和函数式编程的各种特性。

    13 引用 • 11 回帖 • 159 关注
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    83 引用 • 37 回帖
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    9645 引用 • 43860 回帖 • 93 关注
  • Gzip

    gzip (GNU zip)是 GNU 自由软件的文件压缩程序。我们在 Linux 中经常会用到后缀为 .gz 的文件,它们就是 Gzip 格式的。现今已经成为互联网上使用非常普遍的一种数据压缩格式,或者说一种文件格式。

    9 引用 • 12 回帖 • 165 关注
  • 招聘

    哪里都缺人,哪里都不缺人。

    189 引用 • 1057 回帖 • 4 关注
  • Markdown

    Markdown 是一种轻量级标记语言,用户可使用纯文本编辑器来排版文档,最终通过 Markdown 引擎将文档转换为所需格式(比如 HTML、PDF 等)。

    170 引用 • 1529 回帖
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 60 关注
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    6 引用 • 26 回帖 • 547 关注
  • Notion

    Notion - The all-in-one workspace for your notes, tasks, wikis, and databases.

    10 引用 • 77 回帖 • 1 关注
  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 105 关注
  • ngrok

    ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。

    7 引用 • 63 回帖 • 649 关注
  • 深度学习

    深度学习(Deep Learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。

    54 引用 • 41 回帖
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 652 关注
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 177 关注
  • 域名

    域名(Domain Name),简称域名、网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

    44 引用 • 208 回帖 • 3 关注
  • Visio
    1 引用 • 2 回帖 • 4 关注
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖 • 2 关注
  • Bug

    Bug 本意是指臭虫、缺陷、损坏、犯贫、窃听器、小虫等。现在人们把在程序中一些缺陷或问题统称为 bug(漏洞)。

    76 引用 • 1742 回帖
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 507 关注
  • 叶归
    5 引用 • 16 回帖 • 11 关注
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 111 关注
  • Shell

    Shell 脚本与 Windows/Dos 下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比 Windows 下的批处理更强大,比用其他编程程序编辑的程序效率更高,因为它使用了 Linux/Unix 下的命令。

    124 引用 • 74 回帖 • 1 关注
  • 七牛云

    七牛云是国内领先的企业级公有云服务商,致力于打造以数据为核心的场景化 PaaS 服务。围绕富媒体场景,七牛先后推出了对象存储,融合 CDN 加速,数据通用处理,内容反垃圾服务,以及直播云服务等。

    28 引用 • 226 回帖 • 132 关注
  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有计划重制上线。

    14 引用 • 257 回帖 • 1 关注