概念
进程(Process)是程序的一个运行实例,线程是CPU调度的基本单位。
一个程序的主入口一般都是main函数,它所做的工作有两个:
- 初始化
比如Windows环境通常要创建窗口,像系统申请资源等 - 进入死循环
并在循环中处理各种事件,直到进程退出。
Android进程
Activity和Service应用程序的主线程都是ActivityThread,启动新的activity时,Binder线程数量发生了变化。
Handler
Handler.dispatchMessage分发流程
→Message.callback(Runnable 对象)是否为空
在不为空的情况下将优先通过callback来处理
→Handler.mCallback 是否为空
在不为空的情况下,调用 mCallback.handleMessage
→如果前两个对象都不存在,才调用Handler.handleMessage。
Message
Android系统会维护一个全局的message池。当用Message时,可以通过obtain直接获得,而不是自行创建。Message是享元模式的一个实践案例
// 从对象池中取出对象
public static Message obtain() {
synchronized (sPoolSync) {
if (sPool != null) {
Message m = sPool;
sPool = m.next;
m.next = null;
m.flags = 0; // clear in-use flag
sPoolSize--;
return m;
}
}
return new Message();
}
// 回收的时候添加到对象池
void recycleUnchecked() {
// Mark the message as in use while it remains in the recycled object pool.
// Clear out all other details.
flags = FLAG_IN_USE;
what = 0;
arg1 = 0;
arg2 = 0;
obj = null;
replyTo = null;
sendingUid = -1;
when = 0;
target = null;
callback = null;
data = null;
synchronized (sPoolSync) {
if (sPoolSize < MAX_POOL_SIZE) {
next = sPool;
sPool = this;
sPoolSize++;
}
}
}
MessageQueue
- 新建队列 由其构造函数和本地方法nativeInit组成。
- 元素入队 enqueueMesage(Message msg,long when)
- 元素出队 next( ) 当没有Message时会进入阻塞状态
- 删除元素 removeMessages(Handler h,int what,Object object);
- 销毁队列 nativeDestroy
looper
Looper.prepare() 创建了Looper对象,并通过ThreadLocal(一个模板类)与当前线程就行了绑定
Handler构造函数会通过ThreadLocal获取Loop对象,并通过loop获取MessageQueue
一个线程可以设置多个ThreadLocal,一个ThreadLocal可以作为多个线程的TheadLocalMap的Key
通过loop()开启无线循环,当MessageQueue阻塞时,它也就阻塞了
UI主线程--ActivityThread
其他线程可以通过getMainLooper()获取到主线程的Looper, sMainThreadHandler(H对象)处理主线程中的各种消息
//main函数的经典模型伪用代码
main()
{
initialize();//初始化操作
CreateWindow();//创建窗口
ShowWindow();//显示窗口
while(GetMessage())// 不断执行消息,直到收到退出的消息
{
TranslateMessage();// 对消息进行必要的前期处理
DispatchMessage();// 分配消息给相应元素进行处理
}
}
- 创建处理消息的环境
- 循环处理消息
消息是推动整个系统动起来的基础
Thread
线程的几种状态
- new 线程已经创建,但还没有start
- runnable 处于可运行状态一切就绪
- blocked 处于阻塞状态
- waiting 处于等待状态
- timed_waiting 等待特定的时间
- 终止运行
参考
《深入理解Android内核设计思想》
《Android源码设计模式解析与实战》