创建一个 Message 的推荐做法是obtain()@Message 而不是new Message(),是因为 Message 内部维系了一个 Message 池,这个线程池是一个单向链表。自动化进行 Message 的实例化,回收和复用。
Message next;
private static Message sPool;
private static int sPoolSize = 0;
public static Message obtain(){
synchornized (sPoolSync){
if(sPool !=null){
Message m = sPool;
sPool = m.next;
m.next = null;
m.flags = 0;
sPoolSize--;
return m;
}
}
return new Message();
}
第一次进来的时候,sPool = null,直接new Message()返回。当 Message 被回收时,
void recycleUnchecked(){
flags = FLAG_IN_USE;
what = 0;
arg1 = 0;
arg2 = 0;
obj = null;
...
synchronized (sPoolSync){
if(sPoolSize < MAX_POOL_SIZE){
next = sPool;
sPool = this;
sPoolSize ++ ;
}
}
}
可以看到,当一个 Message 被回收后,清空 Message 的信息,然后加入到了这个线程池中,将当前 Message 作为表头放入到链表中,同时将池的大小++,
接下里重新看sPool != null 的逻辑
if(sPool !=null){
Message m = sPool;
sPool = m.next;
m.next = null;
m.flags = 0;
sPoolSize--;
return m;
}
此时取出位于表头的 Message,将m.next 设置为新的表头,池的大小--,随后返回这个 Message。
当 池中有 N 个 Message元素时,被用完后sPool 就被设置成了 null,想继续获得一个 Message 会直接new Message(),除非有旧的 Message被回收。
以上。