/**************************************************************************************************

**********************************************************************************************************************/

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线程池机制相关推荐

  1. Android 多线程之阻塞队列

    Android 多线程系列 Android 多线程之几个基本问题 阻塞队列 阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里取元素的线程.阻塞队列就是生产者存放元素 ...

  2. 【Java 并发编程】线程池机制 ( 线程池阻塞队列 | 线程池拒绝策略 | 使用 ThreadPoolExecutor 自定义线程池参数 )

    文章目录 一.线程池阻塞队列 二.拒绝策略 三.使用 ThreadPoolExecutor 自定义线程池参数 一.线程池阻塞队列 线程池阻塞队列是线程池创建的第 555 个参数 : BlockingQ ...

  3. 【Java面试小短文】当任务数超过线程池的核心线程数,如何让它不进入阻塞队列直接启用最大数量的线程去执行任务?

    欢迎关注Java面试系列,不定期更新面试小短文.欢迎一键三连! 当任务数超过线程池的核心线程数,如何让它不进入阻塞队列直接启用最大数量的线程去执行任务? 当我们提交一个任务到线程池,它的工作原理如下: ...

  4. python线程池阻塞队列_福利又来啦!python多线程进阶篇

    使用Python中的线程模块,能够同时运行程序的不同部分,并简化设计.如果你已经入门Python,并且想用线程来提升程序运行速度的话,希望这篇教程会对你有所帮助. 通过阅读本文,你将了解到:什么是死锁 ...

  5. 锁与并发工具包与线程池与LockSupport与Fork/Join框架与并行流串行流与阻塞队列与JPS,jstack命令查看死锁查看线程状态与AQS个人笔记九

    朝闻道,夕死可矣 本文共计 86564字,估计阅读时长1小时 点击进入->Thread源码万字逐行解析 文章目录 本文共计 86564字,估计阅读时长1小时 一锁 二Java中13个原子操作类 ...

  6. Java多线程闲聊(四):阻塞队列与线程池原理

    Java多线程闲聊(四)-阻塞队列与线程池原理 前言 复用永远是人们永恒的主题,这能让我们更好地避免重复制造轮子. 说到多线程,果然还是绕不开线程池,那就来聊聊吧. 人们往往相信,世界是存在一些规律的 ...

  7. 并发编程-23J.U.C组件拓展之阻塞队列BlockingQueue 和 线程池

    文章目录 概述 阻塞队列的常用场景 阻塞队列的4种处理方式 JDK 7提供的7个阻塞队列 ArrayBlockingQueue LinkedBlockingQueue PriorityBlocking ...

  8. Java多线程学习八:线程池常用的阻塞队列

    线程池内部结构 线程池的内部结构主要由四部分组成,如图所示. 第一部分是线程池管理器,它主要负责管理线程池的创建.销毁.添加任务等管理操作,它是整个线程池的管家. 第二部分是工作线程,也就是图中的线程 ...

  9. JAVA阻塞队列和线程池原理

    阻塞队列 队列 队列是一种特殊的线性表,遵循先入先出.后入后出的基本原则,一般来说,它只允许在表的前端进行删除操作,而在表的后端进行插入操作. 什么是阻塞队列 支持阻塞的插入方法,当队列满时,队列会阻 ...

最新文章

  1. 第十六章 贪心算法——0/1背包问题
  2. [CodeForces1110C]Meaningless Operations
  3. 【案例分享】crontab执行脚本异常问题
  4. mysql fetch rows,php中mysql_fetch_array()和mysql_fetch_rows()函数区别
  5. UVA 11237 - Halloween treats(鸽笼原理)
  6. CSS遮罩层:hover状态丢失及解决方案
  7. 使用yum update更新文件系统时不更新内核的方法
  8. 《代码大全2》读书笔记 Week9
  9. 什么软件可以让头发变黑_震惊!这几招,能让你的头发变黑变多
  10. java字符串去空格、制表符、换页符
  11. mac bookpro m1 笔记本关闭键盘屏幕 禁用键盘屏幕使用 键盘屏幕误触 Touch Bar禁用 禁用MacBook-Pro的触摸栏
  12. JavaScript 事件委托
  13. Python疫情数据采集, 并做可视化展示
  14. PostgreSQL HOT技术内幕解读
  15. 清华梦的粉碎—写给清华大学的退学申请 2005.9.22
  16. AXD 在win7 vista下 启动失败
  17. php多次请求只执行最后一次,取消重复请求,只让最后一次请求通过
  18. Java从接触到放弃(二十一)--网络编程
  19. MySQL 数据类型BINARY和VARBINARY
  20. springboot项目添加了logback-spring.xml配置文件不生效

热门文章

  1. 深度学习网络训练中出现nan的原因分析
  2. 2013dgtcs 数对
  3. 详解Python的装饰器
  4. 【补】day3 table标签
  5. 设计模式网站 http://www.cnblogs.com/justinw/archive/2007/02/06/641414.html
  6. 2018年系列之设计模式汇总贴
  7. 商务部回应中兴被罚:坚决反对美国用国内法制裁中企
  8. 如何快速清理Mac系统上的大额文件
  9. 1D和2D条码生成、检测、识别控件Barcode Xpress
  10. 查看eclipse使用的jre版本