前言

  • 对于多线程,大家应该很熟悉。但是,大家了解线程池吗?
  • 今天,我将带大家全部学习关于线程池的所有知识。

目录


1. 简介


2. 工作原理

2.1 核心参数

  • 线程池中有6个核心参数,具体如下
  • 上述6个参数的配置 决定了 线程池的功能,具体设置时机 = 创建 线程池类对象时 传入
  1. ThreadPoolExecutor类 = 线程池的真正实现类
  2. 开发者可根据不同需求 配置核心参数,从而实现自定义线程池
// 创建线程池对象如下
// 通过 构造方法 配置核心参数Executor executor = new ThreadPoolExecutor( CORE_POOL_SIZE,MAXIMUM_POOL_SIZE,KEEP_ALIVE,TimeUnit.SECONDS, sPoolWorkQueue,sThreadFactory );// 构造函数源码分析public ThreadPoolExecutor (int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable workQueue>,ThreadFactory threadFactory )
复制代码

注:Java 里已内置4种常用的线程池(即 已经配置好核心参数),下面会详细说明

2.2 内部原理逻辑

当线程池运行时,遵循以下工作逻辑


3. 使用流程

线程池的使用流程如下

// 1. 创建线程池// 创建时,通过配置线程池的参数,从而实现自己所需的线程池Executor threadPool = new ThreadPoolExecutor(CORE_POOL_SIZE,MAXIMUM_POOL_SIZE,KEEP_ALIVE,TimeUnit.SECONDS,sPoolWorkQueue,sThreadFactory);// 注:在Java中,已内置4种常见线程池,下面会详细说明// 2. 向线程池提交任务:execute()// 说明:传入 Runnable对象threadPool.execute(new Runnable() {@Overridepublic void run() {... // 线程执行任务}});// 3. 关闭线程池shutdown() threadPool.shutdown();// 关闭线程的原理// a. 遍历线程池中的所有工作线程// b. 逐个调用线程的interrupt()中断线程(注:无法响应中断的任务可能永远无法终止)// 也可调用shutdownNow()关闭线程:threadPool.shutdownNow()// 二者区别:// shutdown:设置 线程池的状态 为 SHUTDOWN,然后中断所有没有正在执行任务的线程// shutdownNow:设置 线程池的状态 为 STOP,然后尝试停止所有的正在执行或暂停任务的线程,并返回等待执行任务的列表// 使用建议:一般调用shutdown()关闭线程池;若任务不一定要执行完,则调用shutdownNow()
复制代码

4. 常见的4类功能线程池

根据参数的不同配置,Java中最常见的线程池有4类:

  • 定长线程池(FixedThreadPool
  • 定时线程池(ScheduledThreadPool )
  • 可缓存线程池(CachedThreadPool
  • 单线程化线程池(SingleThreadExecutor

即 对于上述4类线程池,Java已根据 应用场景 配置好核心参数

4.1 定长线程池(FixedThreadPool)

  • 特点:只有核心线程 & 不会被回收、线程数量固定、任务队列无大小限制(超出的线程任务会在队列中等待)
  • 应用场景:控制线程最大并发数
  • 具体使用:通过 Executors.newFixedThreadPool() 创建
  • 示例:
// 1. 创建定长线程池对象 & 设置线程池线程数量固定为3
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);// 2. 创建好Runnable类线程对象 & 需执行的任务
Runnable task =new Runnable(){public void run(){System.out.println("执行任务啦");}};// 3. 向线程池提交任务:execute()
fixedThreadPool.execute(task);// 4. 关闭线程池
fixedThreadPool.shutdown();
复制代码

4.2 定时线程池(ScheduledThreadPool )

  • 特点:核心线程数量固定、非核心线程数量无限制(闲置时马上回收)
  • 应用场景:执行定时 / 周期性 任务
  • 使用:通过*Executors.newScheduledThreadPool()*创建
  • 示例:
// 1. 创建 定时线程池对象 & 设置线程池线程数量固定为5
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);// 2. 创建好Runnable类线程对象 & 需执行的任务
Runnable task =new Runnable(){public void run(){System.out.println("执行任务啦");}};
// 3. 向线程池提交任务:schedule()
scheduledThreadPool.schedule(task, 1, TimeUnit.SECONDS); // 延迟1s后执行任务
scheduledThreadPool.scheduleAtFixedRate(task,10,1000,TimeUnit.MILLISECONDS);// 延迟10ms后、每隔1000ms执行任务// 4. 关闭线程池
scheduledThreadPool.shutdown();
复制代码

4.3 可缓存线程池(CachedThreadPool)

  • 特点:只有非核心线程、线程数量不固定(可无限大)、灵活回收空闲线程(具备超时机制,全部回收时几乎不占系统资源)、新建线程(无线程可用时)

任何线程任务到来都会立刻执行,不需要等待

  • 应用场景:执行大量、耗时少的线程任务
  • 使用:通过*Executors.newCachedThreadPool()*创建
  • 示例:
// 1. 创建可缓存线程池对象
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();// 2. 创建好Runnable类线程对象 & 需执行的任务
Runnable task =new Runnable(){public void run(){System.out.println("执行任务啦");}};// 3. 向线程池提交任务:execute()
cachedThreadPool.execute(task);// 4. 关闭线程池
cachedThreadPool.shutdown();//当执行第二个任务时第一个任务已经完成
//那么会复用执行第一个任务的线程,而不用每次新建线程。
复制代码

4.4 单线程化线程池(SingleThreadExecutor)

  • 特点:只有一个核心线程(保证所有任务按照指定顺序在一个线程中执行,不需要处理线程同步的问题)

  • 应用场景:不适合并发但可能引起IO阻塞性及影响UI线程响应的操作,如数据库操作,文件操作等

  • 使用:通过*Executors.newSingleThreadExecutor()*创建

  • 示例:

// 1. 创建单线程化线程池
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();// 2. 创建好Runnable类线程对象 & 需执行的任务
Runnable task =new Runnable(){public void run(){System.out.println("执行任务啦");}};// 3. 向线程池提交任务:execute()
singleThreadExecutor.execute(task);// 4. 关闭线程池
singleThreadExecutor.shutdown();复制代码

4.5 常见线程池 总结 & 对比


5. 总结

  • 阅读本文后,相信你已经非常了解线程池 & 用法
  • 接下来,我会继续讲解Android开发中关于多线程的知识,具体包括Thread类、HandlerHandlerThread等等,有兴趣可以继续关注Carson_Ho的安卓开发笔记

请点赞!因为你的鼓励是我写作的最大动力!

Android多线程:这是一份全面 详细的线程池(ThreadPool)讲解教程相关推荐

  1. threadpool的数量_多线程之旅(11)_如何限制系统线程池ThreadPool的最大最小并发数量_SetMaxThreads/SetMinThreads用法...

    ThreadPool有两个设置线程池并发数量的方法,分别是: ThreadPool.SetMinThreads(int workerThreads, int completionPortThreads ...

  2. Carson带你学Android:这是一份全面详细的WebView学习攻略

    前言 现在很多App里都内置了Web网页(Hybrid App),比如说很多电商平台,淘宝.京东.聚划算等等,如下图 那么这种该如何实现呢?其实这是Android里一个叫WebView组件实现 今天, ...

  3. 详细的线程池讲解,手写C与C++版本

    详细的线程池讲解,手写C与C++版本 在此感谢苏丙榅的教程讲的很详细,我看了他的C版本教程,对线程池有了深刻理解,手写了C版本,并自主改了C++版本. 线程池是消费者生产者模型的其中之一.这里面的线程 ...

  4. Carson带你学Android:这是一份全面详细的属性动画学习攻略!

    前言 属性动画的使用 是 Android 开发中常用的知识 本文将献上一份全面 & 详细的属性动画学习指南,将详细介绍属性动画的所有内容,包括:意义.作用.应用场景.功原理 & 具体使 ...

  5. Carson带你学Android:这是一份全面详细的动画学习指南

    前言 动画的使用 是 Android 开发中常用的知识 可是动画的种类繁多.使用复杂,每当需要 采用自定义动画 实现 复杂的动画效果时,很多开发者就显得束手无策 本文将献上一份Android动画的全面 ...

  6. 超详细的线程池原理解析

    说明 线程池作为常用的并发工具重要性不言而喻,本文针对线程池进行了抽丝剥茧般的深入解析,希望大家看后会有帮助. 1 ThreadPoolExecutor关系 2 结构 public ThreadPoo ...

  7. 多线程与高并发(六):线程池可用的各种高并发容器详解:CopyOnWriteList,BlockingQueue等

    容器 物理结构:数组.链表 逻辑结构:很多 Queue主要是为高并发准备的. Vector Hashtable Vector Hashtable 自带锁,有很多设计上不完善的地方,现在基本上不用. 测 ...

  8. python asyncio future 多线程_深究Python中的asyncio库-线程池

    在同步线程中使用的run_in_executor就如它方法的名字所示,把协程放到了一个执行器里面,可以在一个线程池,也可以在一个进程池.另外还可以使用run_coroutine_threadsafe在 ...

  9. 超详细的线程池使用解析

    前言 ​ Java 中线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池.合理的使用线程池可以带来多个好处: ​ (1)降低资源消耗.通过重复利用已创建的线程降低线程 ...

最新文章

  1. 蓝桥杯利用字母可以组成一些美丽的图形,
  2. 在Windows C程序中使用Unicode编码
  3. centos 7.0 查看selinux状态|关闭|开启
  4. ubuntu 升级python3_ubuntu16.04安装python3
  5. 多进程,守护进程,锁
  6. FreeSwitch会议Banner功能调用流程
  7. 最新三网免挂码支付系统源码+免授权版
  8. 2022抖音日活用户超8亿,旅游商家如何从抖音获客?
  9. STM32入门:STM32F401CDU6库函数工程文件搭建
  10. 论文笔记——Real-ESRGAN: Training Real-World Blind Super-Resolution with Pure Synthetic Data
  11. When I started loving myself 当我开始爱自己 ——查理·卓别林
  12. 阿里云服务器ECS实例规格性能区别及选择攻略
  13. deepin升级到20.2,开机显示deepin LOGO之后屏幕黑屏解决办法
  14. 【pygame游戏】用Python实现一个蔡徐坤大战篮球的小游戏,可还行?【附源码】
  15. 国家信息安全水平考试NISP一级模拟题(04)
  16. Conmi的正确答案——linux/ubuntu安装web运维工具(Cockpit)
  17. 开机密码锁定计算机,win10设置开机密码输入错误锁定电脑的方法
  18. LIghtroom CC中.xmp预设文件怎么导入?lr预设xmp文件导入教程!
  19. ​IDC报告深度分析:智能照明势头迅猛,安防仍是重要推动力
  20. H3C Telnet、SSH登录 用户名和密码一致

热门文章

  1. 【转】Powerdesigner逆向工程从sql server数据库生成pdm
  2. ActiveMQ学习笔记(8)——导入ActiveMQ源码到Eclipse
  3. 微软私有云分享(R2)17SCAC被精简的功能
  4. Oracle教程之四招提高Oracle位图索引的使用效果
  5. 解决ViewPager嵌套后子ViewPager不能滑动的方法
  6. domino大百科常见问题总汇1(转载)
  7. SpringBoot整合Swagger测试api构建
  8. 精读《手写 SQL 编译器 - 错误提示》
  9. Day1 - Python基础1作业【编写登陆接口】
  10. 断言(assert)和程序的安全保证