浅谈Android中线程池的管理

  

说到线程就要说说线程机制处理程序,尺蠖,MessageQueue可以说是三座大山了

  

<强>处理

  

处理其实就是一个处理者,或者说一个发送者,它会把消息发送给消息队列,也就是尺蠖,然后在一个无限循环队列中进行取出消息的操作mMyHandler.sendMessage (mMessage);这句话就是我耗时操作处理完了,我发送过去了!然后在接受的地方处理!简单理解是不是很简单。

  

一般我们在项目中异步操作都是怎么做的呢?

     //这里开启一个子线程进行耗时操作   新线程(){   @Override   公共空间run () {   ……   消息mMessage=新消息();   mMessage。=1;//在这里发送给消息队列   mMyHandler.sendMessage (mMessage);   }   } .start ();/* *   *这里就是处理的地方通过msg.what进行处理分辨   */MyHandler扩展处理程序类{   @Override   公共空间handleMessage(消息味精){   super.handleMessage(味精);   开关(msg.what) {//取出对应的消息进行处理   ……   }   }   }   之前      

那么我们的消息队列是在什么地方启动的呢& # 63;跟随源码看一看

        # ActivityThread.main   公共静态void main (String [] args) {//省略代码.....//在这里创建了一个消息队列!   Looper.prepareMainLooper ();      ActivityThread线程=new ActivityThread ();   thread.attach(假);      如果(sMainThreadHandler==null) {   sMainThreadHandler=thread.getHandler ();   }//这句我也没有看懂这不是一直都不会执行的么   如果(false) {   Looper.myLooper () .setMessageLogging(新   LogPrinter(日志。调试、“ActivityThread”);   }      Trace.traceEnd (Trace.TRACE_TAG_ACTIVITY_MANAGER);//消息队列跑起来了!   Looper.loop ();      把新RuntimeException(“主线程循环意外退出”);   }   之前            公共处理程序(回调的回调,布尔异步){   mLooper=Looper.myLooper ();//注意看这里抛出的异常如果这里mLooper==null   如果(mLooper==null) {   把新的RuntimeException (   “不能创建处理程序内部线程没有叫Looper.prepare () ");   }//获取消息队列   mQueue=mLooper.mQueue;   mCallback=回调;   mAsynchronous=异步;   }      之前      

以上操作Android系统就获取并且启动了一个消息队列,过多的源码这里不想去描述,免的占用很多篇幅

  

这里说一下面试常见的一个问题,就是在子线程中可不可以创建一个处理程序,其实是可以的,但是谁这么用啊——

        新线程(){   处理程序mHandler=零;   @Override   公共空间run () {//在这里获取   Looper.prepare ();   mHandler=new处理程序();//在这里启动   Looper.loop ();   }   } .start ();   之前      

<强>多线程的创建

  

一般我们在开发过程中要开启一个线程都是直接

        新线程(){   @Override   公共空间run () {   做.....   }   } .start ();            新线程(新Runnable () {   @Override   公共空间run () {   做.....   }   }) .start ();      

注意看,一个传递了Runnable对象,另一个没有,但是这两个有什么不同,为什么要衍生出2个呢?

  

这里不去看源码,简单叙述一下,实际上线程是可运行的一个包装实现类,可只有一个方法,就是运行(),在这里以前也想过,为什么Runnable只有一个方法呢,后来的某一次交谈中也算是找到一个答案,可能是因为多拓展,可能JAVA语言想拓展一些其他的东西,以后就直接在Runnable再写了,不然我是没有想到另一答案为什么都要传递一个可运行,可能就像我们开发中的baseActivity一样吧

  

<强>线程常用的操作方法

  
      <李> wait()当一个线程执行到了等待()就会进去一个和对象有关的等待池中,同时失去了释放当前对象的机所,使其他线程可以访问,也就是让其他线程可以调用通知()唤醒李   <李>睡眠()调用得线程进入睡眠状态,不能该改变对象的机锁,其他线程不能访问李   <李>加入()就等自己完事李   <李> yidld你急你先来李   
  

简单的白话叙述其实也就是这样,希望能看看演示然后理解一下。

  

一些其他的方法,可调用的,未来,FutureTask

浅谈Android中线程池的管理