爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      如何设计一个线程池

      首页 知识中心 软件开发 文章详情页

      如何设计一个线程池

      2024-09-24 06:30:42 阅读次数:50

      并发,线程池

      如何设计一个线程池?

      三个步骤

      这是一个常见的问题,如果在比较熟悉线程池运作原理的情况下,这个问题并不难。设计实现一个东西,三步走:是什么?为什么?怎么做?

      线程池是什么?

      线程池使用了池化技术,将线程存储起来放在一个 "池子"(容器)里面,来了任务可以用已有的空闲的线程进行处理, 处理完成之后,归还到容器,可以复用。如果线程不够,还可以根据规则动态增加,线程多余的时候,亦可以让多余的线程死亡。

      为什么要用线程池?

      实现线程池有什么好处呢?

      • 降低资源消耗:池化技术可以重复利用已经创建的线程,降低线程创建和销毁的损耗。
      • 提高响应速度:利用已经存在的线程进行处理,少去了创建线程的时间
      • 管理线程可控:线程是稀缺资源,不能无限创建,线程池可以做到统一分配和监控
      • 拓展其他功能:比如定时线程池,可以定时执行任务

      需要考虑的点

      那线程池设计需要考虑的点:

      • 线程池状态:

        • 有哪些状态?如何维护状态?
      • 线程

        • 线程怎么封装?线程放在哪个池子里?
        • 线程怎么取得任务?
        • 线程有哪些状态?
        • 线程的数量怎么限制?动态变化?自动伸缩?
        • 线程怎么消亡?如何重复利用?
      • 任务

        • 任务少可以直接处理,多的时候,放在哪里?
        • 任务队列满了,怎么办?
        • 用什么队列?

      如果从任务的阶段来看,分为以下几个阶段:

      • 如何存任务?
      • 如何取任务?
      • 如何执行任务?
      • 如何拒绝任务?

      线程池状态

      状态有哪些?如何维护状态?

      状态可以设置为以下几种:

      • RUNNING:运行状态,可以接受任务,也可以处理任务
      • SHUTDOWN:不可以接受任务,但是可以处理任务
      • STOP:不可以接受任务,也不可以处理任务,中断当前任务
      • TIDYING:所有线程停止
      • TERMINATED:线程池的最后状态

      各种状态之间是不一样的,他们的状态之间变化如下:

      面试题 -- 如何设计一个线程池

      而维护状态的话,可以用一个变量单独存储,并且需要保证修改时的原子性,在底层操作系统中,对int的修改是原子的,而在32位的操作系统里面,对double,long这种64位数值的操作不是原子的。除此之外,实际上JDK里面实现的状态和线程池的线程数是同一个变量,高3位表示线程池的状态,而低29位则表示线程的数量。

      这样设计的好处是节省空间,并且同时更新的时候有优势。

      线程相关

      线程怎么封装?线程放在哪个池子里?

      线程,即是实现了Runnable接口,执行的时候,调用的是start()方法,但是start()方法内部编译后调用的是 run() 方法,这个方法只能调用一次,调用多次会报错。因此线程池里面的线程跑起来之后,不可能终止再启动,只能一直运行着。既然不可以停止,那么执行完任务之后,没有任务过来,只能是轮询取出任务的过程

      线程可以运行任务,因此封装线程的时候,假设封装成为 Worker, Worker里面必定是包含一个 Thread,表示当前线程,除了当前线程之外,封装的线程类还应该持有任务,初始化可能直接给予任务,当前的任务是null的时候才需要去获取任务。

      可以考虑使用 HashSet 来存储线程,也就是充当线程池的角色,当然,HashSet 会有线程安全的问题需要考虑,那么我们可以考虑使用一个可重入锁比如 ReentrantLock,凡是增删线程池的线程,都需要锁住。

          private final ReentrantLock mainLock = new ReentrantLock();
      

      线程怎么取得任务?

      (1)初始化线程的时候可以直接指定任务,譬如Runnable firstTask,将任务封装到 worker 中,然后获取 worker 里面的 thread,thread.run()的时候,其实就是 跑的是 worker 本身的 run() 方法,因为 worker 本身就是实现了 Runnable 接口,里面的线程其实就是其本身。因此也可以实现对 ThreadFactory 线程工厂的定制化。

          private final class Worker
              extends AbstractQueuedSynchronizer
              implements Runnable
          {
              final Thread thread;
              Runnable firstTask;
      
              ...
      
              Worker(Runnable firstTask) {
                  setState(-1); // inhibit interrupts until runWorker
                  this.firstTask = firstTask;
                  // 从线程池创建线程,传入的是其本身
                  this.thread = getThreadFactory().newThread(this);
              }
          }
      

      (2)运行完任务的线程,应该继续取任务,取任务肯定需要从任务队列里面取,要是任务队列里面没有任务,由于是阻塞队列,那么可以等待,如果等待若干时间后,仍没有任务,倘若该线程池的线程数已经超过核心线程数,并且允许线程消亡的话,应该将该线程从线程池中移除,并结束掉该线程。

      取任务和执行任务,对于线程池里面的线程而言,就是一个周而复始的工作,除非它会消亡。

      线程有哪些状态?

      现在我们所说的是Java中的线程Thread,一个线程在一个给定的时间点,只能处于一种状态,这些状态都是虚拟机的状态,不能反映任何操作系统的线程状态,一共有六种/七种状态:

      • NEW:创建了线程对象,但是还没有调用Start()方法,还没有启动的线程处于这种状态。

      • Running:运行状态,其实包含了两种状态,但是Java线程将就绪和运行中统称为可运行

        • Runnable:就绪状态:创建对象后,调用了start()方法,该状态的线程还位于可运行线程池中,等待调度,获取CPU的使用权
          • 只是有资格执行,不一定会执行
          • start()之后进入就绪状态,sleep()结束或者join()结束,线程获得对象锁等都会进入该状态。
          • CPU时间片结束或者主动调用yield()方法,也会进入该状态
        • Running :获取到CPU的使用权(获得CPU时间片),变成运行中
      • BLOCKED :阻塞,线程阻塞于锁,等待监视器锁,一般是Synchronize关键字修饰的方法或者代码块

      • WAITING :进入该状态,需要等待其他线程通知(notify)或者中断,一个线程无限期地等待另一个线程。

      • TIMED_WAITING :超时等待,在指定时间后自动唤醒,返回,不会一直等待

      • TERMINATED :线程执行完毕,已经退出。如果已终止再调用start(),将会抛出java.lang.IllegalThreadStateException异常。

      面试题 -- 如何设计一个线程池

      线程的数量怎么限制?动态变化?自动伸缩?

      线程池本身,就是为了限制和充分使用线程资的,因此有了两个概念:核心线程数,最大线程数。

      要想让线程数根据任务数量动态变化,那么我们可以考虑以下设计(假设不断有任务):

      • 来一个任务创建一个线程处理,直到线程数达到核心线程数。
      • 达到核心线程数之后且没有空闲线程,来了任务直接放到任务队列。
      • 任务队列如果是无界的,会被撑爆。
      • 任务队列如果是有界的,任务队列满了之后,还有任务过来,会继续创建线程处理,此时线程数大于核心线程数,直到线程数等于最大线程数。
      • 达到最大线程数之后,还有任务不断过来,会触发拒绝策略,根据不同策略进行处理。
      • 如果任务不断处理完成,任务队列空了,线程空闲没任务,会在一定时间内,销毁,让线程数保持在核心线程数即可。

      由上面可以看出,主要控制伸缩的参数是核心线程数,最大线程数,任务队列,拒绝策略。

      线程怎么消亡?如何重复利用?

      线程不能被重新调用多次start(),因此只能调用一次,也就是线程不可能停下来,再启动。那么就说明线程复用只是在不断的循环罢了。

      消亡只是结束了它的run()方法,当线程池数量需要自动缩容的,就会让一部分空闲的线程结束。

      而重复利用,其实是执行完任务之后,再去去任务队列取任务,取不到任务会等待,任务队列是一个阻塞队列,这是一个不断循环的过程。

      任务相关

      任务少可以直接处理,多的时候,放在哪里?

      任务少的时候,来了直接创建,赋予线程初始化任务,就可开始执行,任务多的时候,把它放进队列里面,先进先出。

      任务队列满了,怎么办?

      任务队列满了,会继续增加线程,直到达到最大的线程数。

      用什么队列?

      一般的队列,只是一个有限长度的缓冲区,要是满了,就不能保存当前的任务,阻塞队列可以通过阻塞,保留出当前需要入队的任务,只是会阻塞等待。同样的,阻塞队列也可以保证任务队列没有任务的时候,阻塞当前获取任务的线程,让它进入wait状态,释放cpu的资源。因此在线程池的场景下,阻塞队列其实是比较有必要的。

      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.51cto.com/u_13604316/3765008,作者:秦怀杂货店,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:前端工作总结285-重置新增的mode

      下一篇:ClearspaceMUCTranscriptManager的roomEvents是否存在并发问题

      相关文章

      2025-04-15 09:19:55

      Redis经典问题:数据并发竞争

      Redis经典问题:数据并发竞争

      2025-04-15 09:19:55
      备份 , 并发 , 数据 , 系统 , 缓存 , 读取
      2025-04-09 09:16:00

      突发性异步队列堵塞的解决方案(队列按照优先级分配资源)

      突发性异步队列堵塞的解决方案(队列按照优先级分配资源)

      2025-04-09 09:16:00
      优先级 , 带宽 , 并发 , 接口 , 请求 , 队列
      2025-03-21 08:23:07

      深入理解Java中的多线程编程

      在本文中,我们将探讨Java多线程编程的核心概念和实践。我们将从基本概念开始,逐步深入到线程的创建与管理、同步与锁机制以及高级并发工具的应用。通过实例代码和详细解释,帮助读者全面掌握Java多线程编程的精髓。

      2025-03-21 08:23:07
      Java , Runnable , 同步 , 多线程 , 并发 , 线程 , 编程
      2025-03-21 06:57:11

      【ceph】什么是条带化(Data striping) ?

      【ceph】什么是条带化(Data striping) ?

      2025-03-21 06:57:11
      size , 大小 , 并发 , 数据 , 深度 , 磁盘
      2025-03-18 09:59:32

      Java中的内存模型与并发控制:从基础到高级

      Java中的内存模型与并发控制:从基础到高级

      2025-03-18 09:59:32
      Java , JMM , 内存 , 并发 , 死锁 , 线程 , 编程
      2025-03-18 09:59:32

      深入学习Java语言核心技术

      深入学习Java语言核心技术

      2025-03-18 09:59:32
      Java , JVM , 多线程 , 并发 , 框架 , 线程 , 集合
      2025-03-18 09:59:07

      探索 Java 的未来:强大的新技术与实战应用

      Java 的并发编程模型长期以来受制于重量级线程,这导致高并发系统中线程资源消耗巨大。Project Loom 引入了虚拟线程,它们极其轻量,可以显著降低并发编程的复杂度。

      2025-03-18 09:59:07
      Java , 并发 , 线程 , 虚拟
      2025-03-11 09:35:24

      【高并发】java高并发核心知识

      【高并发】java高并发核心知识

      2025-03-11 09:35:24
      java , 多线程 , 并发 , 线程 , 编程
      2025-03-11 09:34:18

      【java并发】知识框架

      【java并发】知识框架

      2025-03-11 09:34:18
      java , JUC , 并发 , 线程 , 编程
      2025-03-05 09:19:11

      深入理解 Virtual Threads(虚拟线程)

      Java 作为一种流行的编程语言,其生态系统在不断进化,尤其是在最新的版本中引入了许多令人兴奋的功能。本文将为您深入讲解 Java 的最新技术之一——Virtual Threads(虚拟线程),并探讨其在实际项目中的应用价值。

      2025-03-05 09:19:11
      Java , 并发 , 示例 , 线程 , 虚拟
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5249883

      查看更多

      最新文章

      Redis经典问题:数据并发竞争

      2025-04-15 09:19:55

      突发性异步队列堵塞的解决方案(队列按照优先级分配资源)

      2025-04-09 09:16:00

      深入理解Java中的多线程编程

      2025-03-21 08:23:07

      【ceph】什么是条带化(Data striping) ?

      2025-03-21 06:57:11

      Java中的内存模型与并发控制:从基础到高级

      2025-03-18 09:59:32

      探索 Java 的未来:强大的新技术与实战应用

      2025-03-18 09:59:07

      查看更多

      热门文章

      Elasticsearch 处理并发读写操作

      2023-04-24 11:29:46

      Python爬虫-第四章-1-多线程多进程并发爬取Ⅱ

      2023-03-07 07:47:14

      实例讲解ThreadPoolExecutor线程池任务执行过程

      2023-02-27 09:30:53

      线程池ThreadPoolExecutor拒绝策略RejectedExecutionHandler

      2023-03-02 07:12:02

      MySQL线程池

      2023-04-27 08:05:48

      JUI(6)线程池

      2023-02-15 10:02:30

      查看更多

      热门标签

      java Java python 编程开发 代码 开发语言 算法 线程 Python html 数组 C++ 元素 javascript c++
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      使用Java实现简单高效的并发控制

      深入理解Java内存模型:并发编程的艺术

      解决Java中的并发访问问题

      Java中的并发容器:ConcurrentHashMap详解

      Linux线程池

      深入理解Java中的并发锁机制

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号