【Android框架进阶〖02〗】ThinkAndroid线程池机制

来源:互联网 发布:淘宝卖家版登录 编辑:程序博客网 时间:2024/05/23 23:13

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

 *  本博客为CSDN博主【MK】原创,博客地址:http://blog.csdn.net/mkrcpp/article/details/14166627

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

TAApplicationThinkAndroid的灵魂,整个框架的初始化工作都在这里进行了。

其中有一个重要的工作,即初始化线程池机制 ,英文名为TACommandExecutor

之所以称为机制,是因为这不仅仅是一个线程池。

通过观察代码可以看出,最最重要的代码是

public void ensureInitialized(){if (!initialized){initialized = true;TALogger.i(TACommandExecutor.this, "CommandExecutor初始化");TACommandQueueManager.getInstance().initialize();TALogger.i(TACommandExecutor.this, "CommandExecutor初始化");}}

其中涉及到一个很重要的类,即 TACommandQueueManager,看名字就知道这是一个队列管理器 。

好,接下来我们就研究下TACommandQueueManager

非常清晰的,我们看到连个重要的属性,TAThreadPoolTACommandQueue,

看名字就知道一个是线程池,一个是指令队列。然后 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数据activityKeyResIDactivityKeyTAResponse:返回的数据,结果Tag标记Data数据activityKeyResIDactivityKeyTAIResponseListener:数据返回的一个监听器onStart()onSuccess(TAResponse response)onRuning(TAResponse response)onFailure(TAResponse response)onFinish()----------------------------------------------------------------------------TACommand:TAIResponseListenerprivate 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();//abstractonPostExecuteCommand();//null}----------------------------------------------------------------------------TestMVCCommand异步下载,发送信息通知 hanlder处理数据*protected void executeCommand() { 处理耗时任务 sendSuccessMessage(arrayList); }----------------------------------------------------------------------------

应用初始化时,初始化了线程池,和Command 阻塞队列,那么由此可知,上面的一系列代码只是为了实现统一管理 处理耗时任务的 线程,
再简而言之,Command即类似于 AsynTask 中的 doInBackground()执行的内容。

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

 *  本博客为CSDN博主【MK】原创,博客地址:http://blog.csdn.net/mkrcpp/article/details/14166627

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

原创粉丝点击