java的线程池有几种 java线程的创建方式

随着计算机行业的飞速发展 , 摩尔定律逐渐失效 , 多核CPU成为主流 。使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器 。J.U.C提供的线程池ThreadPoolExecutor类 , 帮助开发人员管理线程并方便地执行并行任务 。了解并合理使用线程池 , 是一个开发人员必修的基本功 。
本文开篇了简述线程池概念和用途 , 接着结合线程池的源码 , 帮助大家领略线程池的设计思路 , 最后回归实践 , 通过案例讲述使用线程池遇到的问题 , 并给出了一种动态化线程池解决方案 。

java的线程池有几种 java线程的创建方式

文章插图
一、写在前面1.1 线程池是什么
线程池(Thread Pool)是一种基于池化思想管理线程的工具 , 经常出现在多线程服务器中 , 如MySQL 。
线程过多会带来额外的开销 , 其中包括创建销毁线程的开销、调度线程的开销等等 , 同时也降低了计算机的整体性能 。线程池维护多个线程 , 等待监督管理者分配可并发执行的任务 。这种做法 , 一方面避免了处理任务时创建销毁线程开销的代价 , 另一方面避免了线程数量膨胀导致的过分调度问题 , 保证了对内核的充分利用 。
而本文描述线程池是JDK中提供的ThreadPoolExecutor类 。
当然 , 使用线程池可以带来一系列好处:
  • 降低资源消耗:通过池化技术重复利用已创建的线程 , 降低线程创建和销毁造成的损耗 。
  • 提高响应速度:任务到达时 , 无需等待线程创建即可立即执行 。
  • 提高线程的可管理性:线程是稀缺资源 , 如果无限制创建 , 不仅会消耗系统资源 , 还会因为线程的不合理分布导致资源调度失衡 , 降低系统的稳定性 。使用线程池可以进行统一的分配、调优和监控 。
  • 提供更多更强大的功能:线程池具备可拓展性 , 允许开发人员向其中增加更多的功能 。比如延时定时线程池ScheduledThreadPoolExecutor , 就允许任务延期执行或定期执行 。
1.2 线程池解决的问题是什么
线程池解决的核心问题就是资源管理问题 。在并发环境下 , 系统不能够确定在任意时刻中 , 有多少任务需要执行 , 有多少资源需要投入 。这种不确定性将带来以下若干问题:
  1. 频繁申请/销毁资源和调度资源 , 将带来额外的消耗 , 可能会非常巨大 。
  2. 对资源无限申请缺少抑制手段 , 易引发系统资源耗尽的风险 。
  3. 系统无法合理管理内部的资源分布 , 会降低系统的稳定性 。
为解决资源分配这个问题 , 线程池采用了“池化”(Pooling)思想 。池化 , 顾名思义 , 是为了最大化收益并最小化风险 , 而将资源统一在一起管理的一种思想 。
Pooling is the grouping together of resources (assets, equipment, personnel, effort, etc.) for the purposes of maximizing advantage or minimizing risk to the users. The term is used in finance, computing and equipment management.——wikipedia
“池化”思想不仅仅能应用在计算机领域 , 在金融、设备、人员管理、工作管理等领域也有相关的应用 。
在计算机领域中的表现为:统一管理IT资源 , 包括服务器、存储、和网络资源等等 。通过共享资源 , 使用户在低投入中获益 。除去线程池 , 还有其他比较典型的几种使用策略包括:

推荐阅读