android 线程池 阻塞队列,【Android框架进阶〖02〗】ThinkAndroid线程池机制
/**************************************************************************************************
**********************************************************************************************************************/
TAApplication是ThinkAndroid的灵魂,整个框架的初始化工作都在这里进行了。
其中有一个重要的工作,即初始化线程池机制 ,英文名为TACommandExecutor。
之所以称为机制,是因为这不仅仅是一个线程池。
通过观察代码可以看出,最最重要的代码是
public void ensureInitialized()
{
if (!initialized)
{
initialized = true;
TALogger.i(TACommandExecutor.this, "CommandExecutor初始化");
TACommandQueueManager.getInstance().initialize();
TALogger.i(TACommandExecutor.this, "CommandExecutor初始化");
}
}
其中涉及到一个很重要的类,即 TACommandQueueManager,看名字就知道这是一个队列管理器 。
好,接下来我们就研究下TACommandQueueManager,
非常清晰的,我们看到连个重要的属性,TAThreadPool,TACommandQueue,
看名字就知道一个是线程池,一个是指令队列。然后 TACommandQueueManager的作用就是初始化线程池和初始化队列。
通过研究线程池 TAThreadPool的代码可以知道,默认仅仅是创建了2个线程,并且在系统启动时运行起来。
通过研究指令队列TACommandQueue的代码可以知道它维护了一个LinkedBlockingQueue,一个阻塞队列,由链表实现。
阻塞队列的好处就是:
当一个线程A申请从队列中取数据时,如果队列中没有数据,那么线程A就发生阻塞,直到队列中存在数据。
同样的,当线程B想向队列中存放数据时,如果队列已满,那么线程B阻塞,直到队列中被取走了一个值,这就是咱们熟悉的生产者消费者模式嘛。
OK,说了这么多,稍微整理下
------------------------------------
TACommandQueueManager 初始化了 一个阻塞队列和一个线程池,线程池不断的从队列中取指令并执行
TACommandExecutor 初始化了 TACommandQueueManager
TAApplication 初始化了 TACommandExecutor
------------------------------------
基本上搞清楚了,唯一不清楚的就是什么是Command,阻塞队列维护的是什么样的指令呢,线程池执行的到底是什么呢?
我们来分析下
TAICommand:
-getRequest()获得请求数据
-setRequest(TARequest request)设置请求数据
-getResponse()获得返回数据
-setResponse(TAResponse response)设置赶回数据
-execute()
-getResponseListener()获得响应/返回监听器
-setResponseListener(TAIResponseListener listener)设置响应/返回监听器
-setTerminated(boolean terminated)设置是否终结/停止
-isTerminated()判断状态是否停止
----------------------------------------------------------------------------
TABaseCommand:基础指令
*getRequest()
*setRequest(TARequest request)
*getResponse()
*setResponse(TAResponse response)
*getResponseListener()
*setResponseListener(TAIResponseListener responseListener)
*setTerminated(boolean terminated)
*isTerminated()
TARequest: 请求提交的数据
Tag 标记
Data 数据
activityKeyResID
activityKey
TAResponse:返回的数据,结果
Tag 标记
Data 数据
activityKeyResID
activityKey
TAIResponseListener: 数据返回的一个监听器
onStart()
onSuccess(TAResponse response)
onRuning(TAResponse response)
onFailure(TAResponse response)
onFinish()
----------------------------------------------------------------------------
TACommand:
TAIResponseListener
private Handler handler = new Handler()
{
public void handleMessage(Message msg)
{
switch (msg.what)
{
case command_start:
listener.onStart();
break;
case command_runting:
listener.onRuning(getResponse());
break;
case command_success:
listener.onSuccess(getResponse());
break;
case command_failure:
listener.onFailure(getResponse());
break;
case command_finish:
listener.onFinish();
break;
default:
break;
}
};
};
*public final void execute()
{
onPreExecuteCommand(); //listener.onStart();
executeCommand(); //abstract
onPostExecuteCommand(); //null
}
----------------------------------------------------------------------------
TestMVCCommand 异步下载,发送信息通知 hanlder处理数据
*protected void executeCommand()
{
处理耗时任务
sendSuccessMessage(arrayList);
}
----------------------------------------------------------------------------
应用初始化时,初始化了线程池,和Command 阻塞队列,那么由此可知,上面的一系列代码只是为了实现统一管理 处理耗时任务的 线程,
再简而言之,Command即类似于 AsynTask 中的 doInBackground()执行的内容。
/**************************************************************************************************
**********************************************************************************************************************/
android 线程池 阻塞队列,【Android框架进阶〖02〗】ThinkAndroid线程池机制相关推荐
- Android 多线程之阻塞队列
Android 多线程系列 Android 多线程之几个基本问题 阻塞队列 阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里取元素的线程.阻塞队列就是生产者存放元素 ...
- 【Java 并发编程】线程池机制 ( 线程池阻塞队列 | 线程池拒绝策略 | 使用 ThreadPoolExecutor 自定义线程池参数 )
文章目录 一.线程池阻塞队列 二.拒绝策略 三.使用 ThreadPoolExecutor 自定义线程池参数 一.线程池阻塞队列 线程池阻塞队列是线程池创建的第 555 个参数 : BlockingQ ...
- 【Java面试小短文】当任务数超过线程池的核心线程数,如何让它不进入阻塞队列直接启用最大数量的线程去执行任务?
欢迎关注Java面试系列,不定期更新面试小短文.欢迎一键三连! 当任务数超过线程池的核心线程数,如何让它不进入阻塞队列直接启用最大数量的线程去执行任务? 当我们提交一个任务到线程池,它的工作原理如下: ...
- python线程池阻塞队列_福利又来啦!python多线程进阶篇
使用Python中的线程模块,能够同时运行程序的不同部分,并简化设计.如果你已经入门Python,并且想用线程来提升程序运行速度的话,希望这篇教程会对你有所帮助. 通过阅读本文,你将了解到:什么是死锁 ...
- 锁与并发工具包与线程池与LockSupport与Fork/Join框架与并行流串行流与阻塞队列与JPS,jstack命令查看死锁查看线程状态与AQS个人笔记九
朝闻道,夕死可矣 本文共计 86564字,估计阅读时长1小时 点击进入->Thread源码万字逐行解析 文章目录 本文共计 86564字,估计阅读时长1小时 一锁 二Java中13个原子操作类 ...
- Java多线程闲聊(四):阻塞队列与线程池原理
Java多线程闲聊(四)-阻塞队列与线程池原理 前言 复用永远是人们永恒的主题,这能让我们更好地避免重复制造轮子. 说到多线程,果然还是绕不开线程池,那就来聊聊吧. 人们往往相信,世界是存在一些规律的 ...
- 并发编程-23J.U.C组件拓展之阻塞队列BlockingQueue 和 线程池
文章目录 概述 阻塞队列的常用场景 阻塞队列的4种处理方式 JDK 7提供的7个阻塞队列 ArrayBlockingQueue LinkedBlockingQueue PriorityBlocking ...
- Java多线程学习八:线程池常用的阻塞队列
线程池内部结构 线程池的内部结构主要由四部分组成,如图所示. 第一部分是线程池管理器,它主要负责管理线程池的创建.销毁.添加任务等管理操作,它是整个线程池的管家. 第二部分是工作线程,也就是图中的线程 ...
- JAVA阻塞队列和线程池原理
阻塞队列 队列 队列是一种特殊的线性表,遵循先入先出.后入后出的基本原则,一般来说,它只允许在表的前端进行删除操作,而在表的后端进行插入操作. 什么是阻塞队列 支持阻塞的插入方法,当队列满时,队列会阻 ...
最新文章
- 第十六章 贪心算法——0/1背包问题
- [CodeForces1110C]Meaningless Operations
- 【案例分享】crontab执行脚本异常问题
- mysql fetch rows,php中mysql_fetch_array()和mysql_fetch_rows()函数区别
- UVA 11237 - Halloween treats(鸽笼原理)
- CSS遮罩层:hover状态丢失及解决方案
- 使用yum update更新文件系统时不更新内核的方法
- 《代码大全2》读书笔记 Week9
- 什么软件可以让头发变黑_震惊!这几招,能让你的头发变黑变多
- java字符串去空格、制表符、换页符
- mac bookpro m1 笔记本关闭键盘屏幕 禁用键盘屏幕使用 键盘屏幕误触 Touch Bar禁用 禁用MacBook-Pro的触摸栏
- JavaScript 事件委托
- Python疫情数据采集, 并做可视化展示
- PostgreSQL HOT技术内幕解读
- 清华梦的粉碎—写给清华大学的退学申请 2005.9.22
- AXD 在win7 vista下 启动失败
- php多次请求只执行最后一次,取消重复请求,只让最后一次请求通过
- Java从接触到放弃(二十一)--网络编程
- MySQL 数据类型BINARY和VARBINARY
- springboot项目添加了logback-spring.xml配置文件不生效