[android_linux] 07_线程与进程——线程

Android 4.0

线程与进程——线程

 线程的实现
  1. Thread
  2. Runnable
  3. Handler
  4. AsyncTask
1、Thread
2、Runnable
3、Handler

涉及到的类信息
1、Handler,消息处理器
①sendMessage()
public final boolean sendMessage(Message msg)
{
    return sendMessageDelayed(msg, 0);
}
2、Message,消息
3、MessageQueue,消息队列,新增加的Message放在消息队列的尾部
在sendMessage时,将Message添加到MessageQueue队列中的最后一个
4、Looper,消息轮转器
里面的loop方法,一个死循环while(true),用来从MessageQueue消息队列中取出最后一个Message,
如果没有取出来Message msg = queue.next();那么会被block阻塞在这里
public static void loop() {
    final Looper me = myLooper();
    if (me == null) {
        throw new RuntimeException("No Looper; Looper.prepare() wasn't called on this thread.");
    }
    final MessageQueue queue = me.mQueue;
    ......
}
msg.target.dispatchMessage(msg);  分发消息
在里面handleMessage(msg)处理消息
②那么Looper消息轮转器,如何被调用呢,什么时候被调用?
答:HandlerThread
5、HandlerThread 
HandlerThread extends Thread也就是一个线程,那么找run方法
①Looper.prepare();
②Looper.loop();
6、Handler时序图:
4、AsyncTask(异步任务)
和Handler相比,哪个更轻量级?
答:Handler
public static final Executor THREAD_POOL_EXECUTOR
        = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE,TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory, new ThreadPoolExecutor.DiscardOldestPolicy());
AsyncTask里面有一个线程池,对于大量的消息处理,一个线程处理不过来,需要一个线程池来维护,而对于限有几个消息的话,用Handler轻量级就可以了