Android开发之线程池管理ThreadPoolExecutor和Executors.newSingleThreadExecutor()
在Android开发中网络请求数据在Android4.0以后禁止在主线程请求,那么我们只有新开启线程请求数据了
一般都喜欢简单点这样写:
new Thread(new Runnable() {@Overridepublic void run() {}}).start();new Thread() {@Overridepublic void run() {super.run();}}.start();
这样写确实简洁,但是一般不建议这样写。我们用线程池来会更好
写法一:创建单个线程池:
Executors.newSingleThreadExecutor().execute(new Runnable() {@Overridepublic void run() {}});
但是这样写阿里巴巴java代码规范工具会警告如下:
所以我们用如下方法:
// ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler)
// corePoolSize: 核心线程数,能够同时执行的任务数量
// maximumPoolSize:除去缓冲队列中等待的任务,最大能容纳的任务数(其实是包括了核心线程池数量)
// keepAliveTime:超出workQueue的等待任务的存活时间,就是指maximumPoolSize里面的等待任务的存活时间
// unit:时间单位
// workQueue:阻塞等待线程的队列,一般使用new LinkedBlockingQueue<Runnable>()这个,如果不指定容量,
// 会一直往里边添加,没有限制,workQueue永远不会满;
// threadFactory:创建线程的工厂,使用系统默认的类
// handler:当任务数超过maximumPoolSize时,对任务的处理策略,默认策略是拒绝添加int corePoolSize = Runtime.getRuntime().availableProcessors() * 2 + 1;int maxNumPoolSize = corePoolSize+1;long keepAliveTime = 1;TimeUnit unit = TimeUnit.HOURS;ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(corePoolSize,maxNumPoolSize,keepAliveTime,unit,new LinkedBlockingQueue<Runnable>(),Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());threadPoolExecutor.execute(new Runnable() {@Overridepublic void run() {}});}
关于线程池ThreadPoolExecutor的说明:
1.ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler)
corePoolSize: 核心线程数,能够同时执行的任务数量
maximumPoolSize:除去缓冲队列中等待的任务,最大能容纳的任务数(其实是包括了核心线程池数量)
keepAliveTime:超出workQueue的等待任务的存活时间,就是指maximumPoolSize里面的等待任务的存活时间
unit:时间单位
workQueue:阻塞等待线程的队列,一般使用new LinkedBlockingQueue<Runnable>()这个,如果不指定容量,会一直往里边添加,没有限制,workQueue永远不会满;
threadFactory:创建线程的工厂,使用系统默认的类
handler:当任务数超过maximumPoolSize时,对任务的处理策略,默认策略是拒绝添加执行流程:当线程数小于corePoolSize时,每添加一个任务,则立即开启线程执行当corePoolSize满的时候,后面添加的任务将放入缓冲队列workQueue等待;当workQueue也满的时候,看是否超过maximumPoolSize线程数,如果超过,默认拒绝执行
举例说明:
假如:corePoolSize=2,maximumPoolSize=3,workQueue容量为8;最开始,执行的任务A,B,此时corePoolSize已用完,再次执行任务C,则C将被放入缓冲队列workQueue中等待着,如果后来又添加了7个任务,此时workQueue已满,则后面再来的任务将会和maximumPoolSize比较,由于maximumPoolSize为3,所以只能容纳1个了,因为有2个在corePoolSize中运行了,所以后面来的任务默认都会被拒绝。
Android开发之线程池管理ThreadPoolExecutor和Executors.newSingleThreadExecutor()相关推荐
- Android多线程操作——线程池管理综述
1 前言 android开发,大家最熟悉的肯定是主线程,也就是ui线程,也都知道在非ui线程更新界面会报错提示不允许在子线程更新ui.但是耗时操作还是需要使用子线程,如: new Thread(new ...
- android中的线程池学习笔记
阅读书籍: Android开发艺术探索 Android开发进阶从小工到专家 对线程池原理的简单理解: 创建多个线程并且进行管理,提交的任务会被线程池指派给其中的线程进行执行,通过线程池的统一调度和管理 ...
- Android日记之线程池
前言 在编程中经常会使用线程来异步处理任务,但是每个线程的创建和销毁都需要一定的开销.如果每次执行一个任务都需要一个新进程去执行,则这些线程的创建和销毁将消耗大量的资源:并且线程都是"各自为 ...
- Java队列、线程池及ThreadPoolExecutor自定义线程池实现
目录 1.阻塞队列 2.队列分类 3.API使用 4.线程池 4.1.线程池参数 4.2.线程池实现 4.3.任务执行流程 4.4.拒绝策略 4.5.参数合理值设置 5.自定义线程池流程 6.自定义线 ...
- 【Android 异步操作】线程池 ( 线程池使用示例 | 自定义线程池使用流程 | 自定义任务拒绝处理策略 | 完整代码示例 )
文章目录 一.自定义线程池使用流程 二.自定义任务拒绝处理策略 三.完整代码示例 在博客 [Android 异步操作]线程池 ( 线程池简介 | 线程池初始化方法 | 线程池种类 | AsyncTas ...
- 【Android 异步操作】线程池 ( Worker 简介 | 线程池中的工作流程 runWorker | 从线程池任务队列中获取任务 getTask )
文章目录 一.线程池中的 Worker ( 工作者 ) 二.线程池中的工作流程 runWorker 三.线程池任务队列中获取任务 getTask 在博客 [Android 异步操作]线程池 ( 线程池 ...
- 【Android 异步操作】线程池 ( 线程池 reject 拒绝任务 | 线程池 addWorker 添加任务 )
文章目录 一.线程池 reject 拒绝任务 二.线程池 addWorker 添加任务 在上一篇博客 [Android 异步操作]线程池 ( 线程池 execute 方法源码解析 ) 中 , 讲解 线 ...
- 【Android 异步操作】线程池 ( 线程池简介 | 线程池初始化方法 | 线程池种类 | AsyncTask 使用线程池示例 )
文章目录 一.线程池简介 二.线程池初始化方法简介 三.线程池使用示例 一.线程池简介 线程池一般是实现了 ExecutorService 接口的类 , 一般使用 ThreadPoolExecutor ...
- 【Android 异步操作】线程池 ( 线程池作用 | 线程池种类 | 线程池工作机制 | 线程池任务调度源码解析 )
文章目录 一.线程池作用 二.线程池种类 三.线程池工作机制 四.线程池任务调度源码解析 一.线程池作用 线程池作用 : ① 避免创建线程 : 避免每次使用线程时 , 都需要 创建线程对象 ; ② 统 ...
最新文章
- C++11中std::packaged_task的使用
- LCA 求 树中两个点的距离
- Python:函数变量的使用
- svpwm矢量控制电机相电压波形_如何深入理解SVPWM?
- Dapr牵手.NET学习笔记:用docker-compose部署服务
- 【Trie】阅读理解(luogu 3879/ybtoj Trie-4)
- .NET常用工具类集锦
- 非表单元素如何使用焦点事件
- 4 合并grid列_在 Power BI Desktop 中合并数据
- php tp框架验证,tp5.1验证 - thinkphp5.1框架学习 - php中文网博客
- 3.5.3 连接偏移量管理器
- 戴尔豪斯大学计算机科学学费,加拿大研究生申请案例:渥太华大学录取:电子商业科技申请案例【2013】...
- 海马玩模拟器无法链接问题处理
- C#注册Email发送验证码详解
- @RequiresRoles使用
- smartsvn学习(-)
- Multiplier和Finger的区别和优劣讨论
- 安装nvcc CUDNN
- 一人批量管理多个微信群,有什么好用的社群管理工具?
- Android 手机抓包
热门文章
- Nexys4DDR手写数字图像识别
- 方向向量转欧拉角_欧拉角、旋转向量和旋转矩阵的相互转换
- 20220213-CTF MISC-a_good_idea(stegsolve工具的使用)-2017_Dating_in_Singapore
- 20220129刷题--第4题-- cookie
- java jvm容器_java – YARN:容器和JVM
- bfs理解——hdu6386好题
- 用shell编写一个三角形图案
- JVM的内存配置参数
- Animator动画XML实现
- springboot的war和jar包