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


猜你喜欢
- 本文主要介绍了Spring Security OAuth2 实现登录互踢的示例代码,分享给大家,具体如下:背景说明一个账号只能一处登录,类似
- 在日常工作中,我们可能需要连接多个MongoDB数据源,比如用户库user,日志库log。本章我们来记录连接多个数据源的步骤,以两个数据源为
- C# 4.0提供了一个dynamic 关键字,那么什么是dynamic,究竟dynamic是如何工作的呢?从最简单的示例开始:static
- 1.BeanFactory1.1Spring提供了IOC容器的两种实现方式① BeanFactory:IOC容器的基本实现,是Spring内
- using System.IO; using System.Collections;static string deleteComments
- MyBatis resultMap id标签的错误使用我们在编写VO对象,如果业务场景稍微复杂一点,就会用到集合属性。例如用户查看个人订单列
- 1.添加引用工具箱---右键---选择项--COM组件--Adobe PDF Reader2.使用方法OpenFileDialog open
- 如下所示本来 bookService的引用一直是null。导致每次测试都报空指针异常。然后现在继承相应的 ApplicationTests类
- Docker现在很火,容器技术看上不无所不能,但这实际上是一种误解,不要被炒作出来的泡沫迷住双眼,本文抛去炒作,理性地从Java程序员的角度
- 在项目开发中某些场景必须要用到启动项目后立即执行方式的功能,如我们需要去初始化数据到redis缓存,或者启动后读取相应的字典配置等,这篇文章
- 一、研究背景在我们实际的项目开发中,我们会经常对文件进行相关任务的操作,具体的开发环节中,免不了让我们获取文件的后缀名,通过后缀名来进行下一
- 思路分析:要逆序遍历某个列表,首先要获得一个ListIterator对象,利用for()循环,以ListIterator类的hasNext(
- 详解json string转换为java bean及实例代码pom中添加如下两个库:<dependency> <
- 本文实例讲述了C#读取csv格式文件的方法。分享给大家供大家参考。具体实现方法如下:一、CSV文件规则 1 开头是不留空,以行为单
- 目录前言hibernate-validator基本使用引入依赖编写需要验证对象验证对象属性是否符合要求验证规则空/非空验证bool时间数学字
- 一种可以设置滑动动画的控件,只显示一行布局,在布局文件中的ViewFlipper控件中顺序写好每一行的布局(1).MainActivity.
- 参数为对象1、提交表单2、表单序列化,使用ajax提交var data = $("#addForm").serializ
- 前言虽然Aandroid目前已经有RecyclerView了、非常强大的一个View、可以直接控制成ListView以及GridView等、
- 本文实例为大家分享了C#实现简易多人聊天室的具体代码,供大家参考,具体内容如下只有一个群聊的功能服务端using System;using
- 这篇文章主要介绍了Java通过Scanner了解if...else if语句,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的