Android之线程池ThreadPoolExecutor的简介
作者:smile0528 时间:2021-06-27 02:41:25
Android中的线程池ThreadPoolExecutor解决了单线程下载数据的效率慢和线程阻塞的的问题,它的应用也是优化实现的方式。所以它的重要性不言而喻,但是它的复杂性也大,理解上可能会有问题,不过作为安卓工程师,了解这个也是必然的。
ThreadPoolExecutor有几个构造函数,最多参数的构造函数最常用,下面会详细介绍各个参数的含义及其几个参数之间的关系:
<span style="font-size:18px;">ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler)</span>
各个参数的含义:
corePoolSize
: 核心线程数,能够同时执行的任务数量
maximumPoolSize
:除去缓冲队列中等待的任务,最大能容纳的任务数(其实是包括了核心线程池数量)
keepAliveTime
:超出workQueue的等待任务的存活时间maximumPoolSize放置的一个线程的存活时间
unit
:时间单位
workQueue
:阻塞等待线程的队列,一般使用new LinkedBlockingQueue<Runnable>()
这个,如果不指定容量, 会一直往里边添加,没有限制,workQueue永远不会满;
threadFactory
:创建线程的工厂,使用系统默认的类
handler
:当任务数超过maximumPoolSize时,对任务的处理策略,默认策略是拒绝添加
需要注意的是这里的handler与安卓中的handler不同
执行流程:
当线程数小于corePoolSize时,每添加一个任务,则立即开启线程执行
当corePoolSize满的时候,后面添加的任务将放入缓冲队列workQueue等待;
当workQueue也满的时候,看是否超过maximumPoolSize线程数,如果超过,默认拒绝执行
总结来说:核心线程corePoolSize、任务队列workQueue、最大线程maximumPoolSize,如果三者都满了,使用handler处理被拒绝的任务。当一个线程的存活时间到达指定的存活时间索命该线程的任务已执行完,该线程的生命周期结束,被拒绝的线程可以重新进入线程池中开始任务,依次循环此过程。
举例说明:
假如:
corePoolSize=2,maximumPoolSize=3,workQueue容量为8;
最开始,执行的任务A,B,此时corePoolSize已用完,再次执行任务C,则C将被放入缓冲队列workQueue中等待着,如果后来又添加了7个任务,此时workQueue已满,则后面再来的任务的数量是5将会和maximumPoolSize比较,由于maximumPoolSize为3,所以只能容纳1个了,因为包含corePollSize个数,所以后面来的任务默认都会被拒绝4个。
来源:https://blog.csdn.net/smile0528/article/details/52496964
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
C#多线程等待所有子线程结束的示例
ShardingSphere jdbc实现分库分表核心概念详解
![](https://img.aspxhome.com/file/2023/3/59763_0s.png)
使用注解解决ShardingJdbc不支持复杂SQL方法
![](https://img.aspxhome.com/file/2023/5/63795_0s.png)
c++换行符知识点总结
基于WPF实现3D画廊动画效果的示例代码
![](https://img.aspxhome.com/file/2023/4/96364_0s.png)
JavaWeb核心技术中Session与Cookie浅析
![](https://img.aspxhome.com/file/2023/2/79302_0s.png)
MyBatis学习教程(三)-MyBatis配置优化
![](https://img.aspxhome.com/file/2023/4/66674_0s.png)
c# SqlDataAdapter中的Fill是怎么实现的
![](https://img.aspxhome.com/file/2023/2/98242_0s.png)
Java 遍历取出Map集合key-value数据的4种方法
![](https://img.aspxhome.com/file/2023/0/71640_0s.png)
Android使用Intent.ACTION_SEND分享图片和文字内容的示例代码
修改maven本地仓库路径的方法
centos 安装java环境的多种方法
Java Swing中JDialog实现用户登陆UI示例
![](https://img.aspxhome.com/file/2023/9/68709_0s.jpg)
Mybatis如何配置连接池
java如何获取map中value的最大值
聊聊Spring——AOP详解(AOP概览)
![](https://img.aspxhome.com/file/2023/8/73128_0s.png)
C#串口通信实现方法
Java详解实现多线程的四种方式总结
![](https://img.aspxhome.com/file/2023/8/71138_0s.png)
java中字符串转整数及MyAtoi方法的实现
![](https://img.aspxhome.com/file/2023/2/102652_0s.jpg)