中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

Android線程什么情況下會進入等待狀態

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

本篇內容主要講解“Android線程什么情況下會進入等待狀態”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Android線程什么情況下會進入等待狀態”吧!

兩種情況,一是當消息隊列中沒有消息時,它會使線程進入等待狀態;;二是消息隊列中有消息,但是消息指定了執行的時間,而現在還沒有到這個時間,線程也會進入等待狀態。

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

這個函數最關鍵的地方便是從消息隊列中獲取下一個要處理的消息了,即MessageQueue.next函數,它實現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. }

執行下面語句是看看當前消息隊列中有沒有消息:

[java] view plaincopynativePollOnce(mPtr, nextPollTimeoutMillis);

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

到此,相信大家對“Android線程什么情況下會進入等待狀態”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

高密市| 扎鲁特旗| 墨江| 布拖县| 广平县| 彰武县| 牙克石市| 安康市| 新龙县| 武平县| 综艺| 大关县| 海南省| 内丘县| 安宁市| 四川省| 通城县| 青铜峡市| 本溪| 枣强县| 湘潭市| 方山县| 阳江市| 察雅县| 全椒县| 塘沽区| 三都| 施甸县| 通海县| 象州县| 师宗县| 仁寿县| 常宁市| 盱眙县| 乌兰察布市| 乌拉特中旗| 昭觉县| 永春县| 齐河县| 高雄县| 楚雄市|