<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>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                前兩篇講了任務的添加和9大項配置,這篇講任務的執行。 # 任務的執行 任務的執行在CommandScheduler的run方法中,所以刪除所有的斷點,在run方法中打上斷點,重啟啟動debug: ![](https://box.kancloud.cn/2016-01-09_56911dce563b8.jpg) 先看while循環下面的第一行代碼 ~~~ ExecutableCommand?cmd?=?dequeueConfigCommand(); ~~~ ~~~ private ExecutableCommand dequeueConfigCommand() { try { // poll for a command, rather than block indefinitely, to handle shutdown case return mCommandQueue.poll(getCommandPollTimeMs(), TimeUnit.MILLISECONDS); } catch (InterruptedException e) { CLog.i("Waiting for command interrupted"); } return null; } ~~~ 從隊列中取出第一個對象。如果隊列中沒有元素那就返回null。返回后,while中會判斷如果為null的話,就會結束再次調用 ~~~ ExecutableCommand?cmd?=?dequeueConfigCommand(); ~~~ 直到cmd不為null。所以在 ~~~ IDeviceSelection?options?=?cmd.getConfiguration().getDeviceRequirements(); ~~~ 打上斷點,按F8,程序會在cmd不為null時進入到上面的代碼,停下來。 ![](https://box.kancloud.cn/2016-01-09_56911dcea9e22.jpg) 首先得到系統設備要求,根據該要求,判斷是否有滿足要求的設備并分配該設備。 ![](https://box.kancloud.cn/2016-01-09_56911dcedbbb4.jpg) 原生的 要求就一個S/N號,ddms會根據該SN號分配一個IDevice,然后cts根據IDevice包裝成ITestDevice對象返回。然后根據ITestDevice,IDeviceManager和ExecutableCommand開始真正的啟動任務。我們先不急于討論執行的過程,而是繼續向下看: ~~~ addInvocationThread(invThread); if (cmd.isLoopMode()) { addNewExecCommandToQueue(cmd.getCommandTracker()); } ~~~ 先將正在執行的線程存到set中,然后將該命令再次放入任務隊列中,這樣的目的是為了能循環執行該任務。如果根據sn號沒有分配成功ITestDevice,則會再次嘗試一次,如果在規定時間內還沒找到設備則放棄。最后做一些tearDown操作,然后將case運行過程中的log保存到文件。就算執行完了。 現在回頭看一下執行任務的線程中是如何操作的: ~~~ private InvocationThread startInvocation(IDeviceManager manager, ITestDevice device, ExecutableCommand cmd) { final String invocationName = String.format("Invocation-%s", device.getSerialNumber()); InvocationThread invocationThread = new InvocationThread(invocationName, manager, device, cmd); invocationThread.start(); return invocationThread; } ~~~ InvocationThread為CommandScheduler私有內部類,繼承與線程,這就屬于線程里啟動線程。所以直接看InvocationThread的run方法就ok了。在run方法里調用了ITestInvocation的invoke方法: ![](https://box.kancloud.cn/2016-01-09_56911dcf07e9c.jpg) 傳入的對象分別為ITestDevice、IConfiguration、IRescheduler。前兩個已經涉及到,最后一個IRescheduler是什么?自己看吧,也沒啥意義。這樣任務的前期的工作都已經搞定了,程序轉到了TestInvocation的invoke方法。放到下一篇文章來講,因為它很重要,相當于一個調度室的作用。 # 總結 寫了6篇,總結一些cts的過程。 任務的開始點是接受命令行中的參數,如果判斷為執行cts任務,那么會在Console.run方法中啟動添加命令任務的線程**ArgRunnable**和執行任務的線程**CommandScheduler**。添加任務線程**ArgRunnable**會調用**CommandScheduler**對象方法addCommand來向**ConditionPriorityBlockingQueue(采用先進先出的隊列)**這個隊列中添加,而執行任務線程**CommandScheduler**會通過調用自己的私有方法dequeueConfigCommand來從 **ConditionPriorityBlockingQueue**去取可執行的任務,每次取第一個。然后調用**InvocationThread**這個線程去執行任務。**InvocationThread**這個線程調用TestInvocation.invoke方法去執行任務。 明白了么,其實很簡單!![](https://box.kancloud.cn/2016-01-09_56911dcf36bd4.gif)
                  <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>

                              哎呀哎呀视频在线观看