溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Android線程什么情況下會進(jìn)入等待狀態(tài)

發(fā)布時間:2021-12-18 16:40:55 來源:億速云 閱讀:120 作者:iii 欄目:移動開發(fā)

本篇內(nèi)容主要講解“Android線程什么情況下會進(jìn)入等待狀態(tài)”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Android線程什么情況下會進(jìn)入等待狀態(tài)”吧!

兩種情況,一是當(dāng)消息隊列中沒有消息時,它會使線程進(jìn)入等待狀態(tài);;二是消息隊列中有消息,但是消息指定了執(zhí)行的時間,而現(xiàn)在還沒有到這個時間,線程也會進(jìn)入等待狀態(tài)。

消息隊列中的消息是按時間先后來排序的,后面我們在分  析消息的發(fā)送時會看到。

這個函數(shù)最關(guān)鍵的地方便是從消息隊列中獲取下一個要處理的消息了,即MessageQueue.next函數(shù),它實(shí)現(xiàn)frameworks/base/core/java/android/os/MessageQueue.java文件中:

  1. [java] view plaincopypublic class MessageQueue { 

  2. ...... 

  3. final Message next() { 

  4. int pendingIdleHandlerCount = -1; // -1 only during first iteration 

  5. int nextPollTimeoutMillis = 0; 

  6. for (;;) { 

  7. if (nextPollTimeoutMillis != 0) { 

  8. Binder.flushPendingCommands(); 

  9. nativePollOnce(mPtr, nextPollTimeoutMillis); 

  10. synchronized (this) { 

  11. // Try to retrieve the next message. Return if found. 

  12. final long now = SystemClock.uptimeMillis(); 

  13. final Message msg = mMessages; 

  14. if (msg != null) { 

  15. final long when = msg.when; 

  16. if (now >= when) { 

  17. mBlocked = false; 

  18. mMessages = msg.next; 

  19. msg.next = null; 

  20. if (Config.LOGV) Log.v("MessageQueue", "Returning message: " + msg); 

  21. return msg; 

  22. } else { 

  23. nextPollTimeoutMillis = (int) Math.min(when - now, Integer.MAX_VALUE); 

  24. } else { 

  25. nextPollTimeoutMillis = -1; 

  26. // If first time, then get the number of idlers to run. 

  27. if (pendingIdleHandlerCount < 0) { 

  28. pendingIdleHandlerCount = mIdleHandlers.size(); 

  29. if (pendingIdleHandlerCount == 0) { 

  30. // No idle handlers to run. Loop and wait some more. 

  31. mBlocked = true; 

  32. continue; 

  33. if (mPendingIdleHandlers == null) { 

  34. mPendingIdleHandlers = new IdleHandler[Math.max(pendingIdleHandlerCount, 

  35. ]; 

  36. mPendingIdleHandlers = mIdleHandlers.toArray(mPendingIdleHandlers); 

  37. // Run the idle handlers. 

  38. // We only ever reach this code block during the first iteration. 

  39. for (int i = 0; i < pendingIdleHandlerCount; i++) { 

  40. final IdleHandler idler = mPendingIdleHandlers[i]; 

  41. mPendingIdleHandlers[i] = null; // release the reference to the handler 

  42. boolean keep = false; 

  43. try { 

  44. keep = idler.queueIdle(); 

  45. } catch (Throwable t) { 

  46. Log.wtf("MessageQueue", "IdleHandler threw exception", t); 

  47. if (!keep) { 

  48. synchronized (this) { 

  49. mIdleHandlers.remove(idler); 

  50. // Reset the idle handler count to 0 so we do not run them again. 

  51. pendingIdleHandlerCount = 0; 

  52. // While calling an idle handler, a new message could have been 

  53. livered 

  54. // so go back and look again for a pending message without waiting. 

  55. nextPollTimeoutMillis = 0; 

  56. ...... 

  57. }

執(zhí)行下面語句是看看當(dāng)前消息隊列中有沒有消息:

[java] view plaincopynativePollOnce(mPtr, nextPollTimeoutMillis);

這是一個JNI方法,我們等一下再分析,這里傳入的參數(shù)mPtr就是指向前面我們在JNI層創(chuàng)建的NativeMessageQueue對象了,而參數(shù) nextPollTimeoutMillis則表示如果當(dāng)前消息隊列中沒有消息,它要等待的時候,for循環(huán)開始時,傳入的值為0,表示不等待。

到此,相信大家對“Android線程什么情況下會進(jìn)入等待狀態(tài)”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI