说到线程就要说说线程机制处理程序,尺蠖,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中线程池的管理