<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                重要的內容都已講過了,現在就剩下最后兩個函數startThreadPool()和joinThreadPool沒有分析了。它們就太簡單了不是? 1. 創造勞動力——startThreadPool() startThreadPool()的實現,如下面的代碼所示: **ProcessState.cpp** ~~~ //太簡單,沒什么好說的 void ProcessState::startThreadPool() { AutoMutex _l(mLock); //如果要是已經startThreadPool的話,這個函數就沒有什么實質作用了 if(!mThreadPoolStarted) { mThreadPoolStarted = true; spawnPooledThread(true); //注意,傳進去的參數是true } } ~~~ 上面的spawnPooledThread()函數的實現,如下所示: **ProcessState.cpp** ~~~ void ProcessState::spawnPooledThread(bool isMain) { //注意,isMain參數是true。 if(mThreadPoolStarted) { int32_t s = android_atomic_add(1, &mThreadPoolSeq); char buf[32]; sprintf(buf, "Binder Thread #%d", s); sp<Thread> t = new PoolThread(isMain); t->run(buf); } } ~~~ PoolThread是在IPCThreadState中定義的一個Thread子類,它的實現,如下所示: **IPCThreadState.h::PoolThread類** ~~~ class PoolThread : public Thread { public: PoolThread(bool isMain) :mIsMain(isMain){} protected: virtualbool threadLoop() { //線程函數如此簡單,不過是在這個新線程中又創建了一個IPCThreadState。 // 你還記得它是每個伙計都有一個的嗎? IPCThreadState::self()->joinThreadPool(mIsMain); return false; } const boolmIsMain; }; ~~~ 2. 萬眾歸一——joinThreadPool 還需要看看IPCThreadState的joinThreadPool的實現,因為新創建的線程也會調用這個函數,具體代碼如下所示: **IPCThreadState.cpp** ~~~ void IPCThreadState::joinThreadPool(bool isMain) { //注意,如果isMain為true,我們需要循環處理。把請求信息寫到mOut中,待會兒一起發出去 mOut.writeInt32(isMain ? BC_ENTER_LOOPER : BC_REGISTER_LOOPER); androidSetThreadSchedulingGroup(mMyThreadId, ANDROID_TGROUP_DEFAULT); status_tresult; do { int32_t cmd; if(mIn.dataPosition() >= mIn.dataSize()) { size_t numPending = mPendingWeakDerefs.size(); if (numPending > 0) { for (size_t i = 0; i < numPending; i++) { RefBase::weakref_type* refs = mPendingWeakDerefs[i]; refs->decWeak(mProcess.get()); } mPendingWeakDerefs.clear(); } //處理已經死亡的BBinder對象 numPending = mPendingStrongDerefs.size(); if (numPending > 0) { for (size_t i = 0; i < numPending; i++) { BBinder* obj = mPendingStrongDerefs[i]; obj->decStrong(mProcess.get()); } mPendingStrongDerefs.clear(); } } // 發送命令,讀取請求 result = talkWithDriver(); if(result >= NO_ERROR) { size_t IN = mIn.dataAvail(); if (IN < sizeof(int32_t)) continue; cmd = mIn.readInt32(); result= executeCommand(cmd); //處理消息 } ...... } while(result != -ECONNREFUSED && result != -EBADF); mOut.writeInt32(BC_EXIT_LOOPER); talkWithDriver(false); } ~~~ 原來,我們的兩個伙計在talkWithDriver,它們希望能從Binder設備那里找到點可做的事情。 3. 有幾個線程在服務 到底有多少個線程在為Service服務呢?目前看來是兩個: - startThreadPool中新啟動的線程通過joinThreadPool讀取Binder設備,查看是否有請求。 - 主線程也調用joinThreadPool讀取Binder設備,查看是否有請求。看來,binder設備是支持多線程操作的,其中一定是做了同步方面的工作。 mediaserver這個進程一共注冊了4個服務,繁忙的時候,兩個線程會不會顯得有點少呢?另外,如果實現的服務負擔不是很重,完全可以不調用startThreadPool創建新的線程,使用主線程即可勝任。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看