FixedThreadPool vs CachedThreadPool

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

之前写了一篇文章关于四种线程池的解析。
但是对于 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 关注

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • JetBrains

    JetBrains 是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄国的圣彼得堡及美国麻州波士顿都设有办公室,该公司最为人所熟知的产品是 Java 编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA

    18 引用 • 54 回帖
  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    49 引用 • 33 回帖 • 54 关注
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    268 引用 • 666 回帖
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖 • 7 关注
  • sts
    2 引用 • 2 回帖 • 247 关注
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 641 关注
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖 • 1 关注
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1062 引用 • 3455 回帖 • 137 关注
  • 浅吟主题

    Jeffrey Chen 制作的思源笔记主题,项目仓库:https://github.com/TCOTC/Whisper

    2 引用 • 34 回帖 • 1 关注
  • 机器学习

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

    77 引用 • 37 回帖
  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    960 引用 • 946 回帖
  • IBM

    IBM(国际商业机器公司)或万国商业机器公司,简称 IBM(International Business Machines Corporation),总公司在纽约州阿蒙克市。1911 年托马斯·沃森创立于美国,是全球最大的信息技术和业务解决方案公司,拥有全球雇员 30 多万人,业务遍及 160 多个国家和地区。

    17 引用 • 53 回帖 • 152 关注
  • DevOps

    DevOps(Development 和 Operations 的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

    59 引用 • 25 回帖
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖
  • CSDN

    CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。

    14 引用 • 155 回帖
  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    42 引用 • 130 回帖 • 251 关注
  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 234 关注
  • 一些有用的避坑指南。

    69 引用 • 93 回帖
  • Word
    13 引用 • 41 回帖
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖
  • BND

    BND(Baidu Netdisk Downloader)是一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac,详细介绍请看这里

    107 引用 • 1281 回帖 • 43 关注
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 114 关注
  • CloudFoundry

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

    4 引用 • 16 回帖 • 200 关注
  • 以太坊

    以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统。以太坊是一个平台和一种编程语言 Solidity,使开发人员能够建立和发布下一代去中心化应用。 以太坊可以用来编程、分散、担保和交易任何事物:投票、域名、金融交易所、众筹、公司管理、合同和知识产权等等。

    34 引用 • 367 回帖 • 1 关注
  • Openfire

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

    6 引用 • 7 回帖 • 119 关注
  • 心情

    心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。

    59 引用 • 369 回帖
  • 工具

    子曰:“工欲善其事,必先利其器。”

    303 引用 • 772 回帖