在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()相关推荐

  1. Android多线程操作——线程池管理综述

    1 前言 android开发,大家最熟悉的肯定是主线程,也就是ui线程,也都知道在非ui线程更新界面会报错提示不允许在子线程更新ui.但是耗时操作还是需要使用子线程,如: new Thread(new ...

  2. android中的线程池学习笔记

    阅读书籍: Android开发艺术探索 Android开发进阶从小工到专家 对线程池原理的简单理解: 创建多个线程并且进行管理,提交的任务会被线程池指派给其中的线程进行执行,通过线程池的统一调度和管理 ...

  3. Android日记之线程池

    前言 在编程中经常会使用线程来异步处理任务,但是每个线程的创建和销毁都需要一定的开销.如果每次执行一个任务都需要一个新进程去执行,则这些线程的创建和销毁将消耗大量的资源:并且线程都是"各自为 ...

  4. Java队列、线程池及ThreadPoolExecutor自定义线程池实现

    目录 1.阻塞队列 2.队列分类 3.API使用 4.线程池 4.1.线程池参数 4.2.线程池实现 4.3.任务执行流程 4.4.拒绝策略 4.5.参数合理值设置 5.自定义线程池流程 6.自定义线 ...

  5. 【Android 异步操作】线程池 ( 线程池使用示例 | 自定义线程池使用流程 | 自定义任务拒绝处理策略 | 完整代码示例 )

    文章目录 一.自定义线程池使用流程 二.自定义任务拒绝处理策略 三.完整代码示例 在博客 [Android 异步操作]线程池 ( 线程池简介 | 线程池初始化方法 | 线程池种类 | AsyncTas ...

  6. 【Android 异步操作】线程池 ( Worker 简介 | 线程池中的工作流程 runWorker | 从线程池任务队列中获取任务 getTask )

    文章目录 一.线程池中的 Worker ( 工作者 ) 二.线程池中的工作流程 runWorker 三.线程池任务队列中获取任务 getTask 在博客 [Android 异步操作]线程池 ( 线程池 ...

  7. 【Android 异步操作】线程池 ( 线程池 reject 拒绝任务 | 线程池 addWorker 添加任务 )

    文章目录 一.线程池 reject 拒绝任务 二.线程池 addWorker 添加任务 在上一篇博客 [Android 异步操作]线程池 ( 线程池 execute 方法源码解析 ) 中 , 讲解 线 ...

  8. 【Android 异步操作】线程池 ( 线程池简介 | 线程池初始化方法 | 线程池种类 | AsyncTask 使用线程池示例 )

    文章目录 一.线程池简介 二.线程池初始化方法简介 三.线程池使用示例 一.线程池简介 线程池一般是实现了 ExecutorService 接口的类 , 一般使用 ThreadPoolExecutor ...

  9. 【Android 异步操作】线程池 ( 线程池作用 | 线程池种类 | 线程池工作机制 | 线程池任务调度源码解析 )

    文章目录 一.线程池作用 二.线程池种类 三.线程池工作机制 四.线程池任务调度源码解析 一.线程池作用 线程池作用 : ① 避免创建线程 : 避免每次使用线程时 , 都需要 创建线程对象 ; ② 统 ...

最新文章

  1. C++11中std::packaged_task的使用
  2. LCA 求 树中两个点的距离
  3. Python:函数变量的使用
  4. svpwm矢量控制电机相电压波形_如何深入理解SVPWM?
  5. Dapr牵手.NET学习笔记:用docker-compose部署服务
  6. 【Trie】阅读理解(luogu 3879/ybtoj Trie-4)
  7. .NET常用工具类集锦
  8. 非表单元素如何使用焦点事件
  9. 4 合并grid列_在 Power BI Desktop 中合并数据
  10. php tp框架验证,tp5.1验证 - thinkphp5.1框架学习 - php中文网博客
  11. 3.5.3 连接偏移量管理器
  12. 戴尔豪斯大学计算机科学学费,加拿大研究生申请案例:渥太华大学录取:电子商业科技申请案例【2013】...
  13. 海马玩模拟器无法链接问题处理
  14. C#注册Email发送验证码详解
  15. @RequiresRoles使用
  16. smartsvn学习(-)
  17. Multiplier和Finger的区别和优劣讨论
  18. 安装nvcc CUDNN
  19. 一人批量管理多个微信群,有什么好用的社群管理工具?
  20. Android 手机抓包

热门文章

  1. Nexys4DDR手写数字图像识别
  2. 方向向量转欧拉角_欧拉角、旋转向量和旋转矩阵的相互转换
  3. 20220213-CTF MISC-a_good_idea(stegsolve工具的使用)-2017_Dating_in_Singapore
  4. 20220129刷题--第4题-- cookie
  5. java jvm容器_java – YARN:容器和JVM
  6. bfs理解——hdu6386好题
  7. 用shell编写一个三角形图案
  8. JVM的内存配置参数
  9. Animator动画XML实现
  10. springboot的war和jar包