韓夢飛沙 yue31313 韓亞飛 han_meng_fei_sha [email protected]
一般的像我們普通呼叫handler傳送訊息,最後都會呼叫messagequeue的enqueuemessage。
[cpp]view plain
copy
public boolean sendmessageattime(message msg, long uptimemillis)
return enqueuemessage(queue, msg, uptimemillis);
} 像sendmessageatfrontofqueue這樣只是最後的時間設定為0,自然就排在佇列的前面了。
[cpp]view plain
copy
public final boolean sendmessageatfrontofqueue(message msg)
return enqueuemessage(queue, msg, 0);
} private boolean enqueuemessage(messagequeue queue, message msg, long uptimemillis)
return queue.enqueuemessage(msg, uptimemillis);
} 最後就到messagequeue的enqueuemessage函式中去了,該函式就是根據when把這個msg插入到合適的訊息佇列中。
[cpp]view plain
copy
boolean enqueuemessage(message msg, long when) else
if (needwake && p.isasynchronous())
} msg.next = p; // invariant: p == prev.next
prev.next = msg;//這其實就是把該message插入合適的位置
} // we can assume mptr != 0 because mquitting is false.
if (needwake)
} return true;
} 最後我們再看下messagequeue的next函式,就是訊息執行緒迴圈時會不斷呼叫messagequeue的next來獲取當前訊息。
[cpp]view plain
copy
message next()
int pendingidlehandlercount = -1; // -1 only during first iteration
int nextpolltimeoutmillis = 0;
for (;;)
nativepollonce(ptr, nextpolltimeoutmillis);//c層的epoll函式會阻塞
synchronized (this) while (msg != null && !msg.isasynchronous());
} if (msg != null) else else
msg.next = null;
if (debug) log.v(tag, "returning message: " + msg);
msg.markinuse();
return msg;
} } else
......
安卓ui執行緒優先順序
b own.settag tag installing updatedownloadbtnstate b own,game,downloadstate.finished 更新按鈕狀態 此方法包含按鈕文字和顏色 modmgr.getgamedownloadmgr installapk context,...
佇列 優先順序佇列
優先順序佇列的隊尾是不需要改變的,永遠在低下標處。當佇列增加資料時,隊頭的位置就是資料項的大小減去1.public class priorityq 插入 public void insert long item else quearray j 1 item nitem 刪除 public long ...
優先順序佇列
分為最小優先順序佇列和最大優先順序佇列。優先順序佇列是一種用來維護一組元素構成的集合s的資料結構,這一組元素都有乙個關鍵字key,乙個最大優先順序佇列支援的操作 insert s,x 把x插入到集合s中 maxmum s 返回s中最大元素 extra max s 去掉s中最大關鍵字並返回該最大關鍵子...