91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

邯郸县| 延庆县| 察雅县| 鄂托克前旗| 临海市| 新竹市| 龙门县| 满城县| 昭觉县| 双柏县| 勃利县| 改则县| 和林格尔县| 莆田市| 商城县| 开江县| 咸丰县| 桐梓县| 中西区| 邳州市| 泸西县| 浪卡子县| 凤台县| 墨脱县| 固原市| 五原县| 宝兴县| 名山县| 渑池县| 东丰县| 大邑县| 鹿邑县| 台前县| 兴海县| 淮北市| 博客| 漯河市| 葵青区| 新乡市| 墨竹工卡县| 山东省|