前两篇讲了任务的加入和9大项配置,这篇讲任务的运行。

任务的运行

任务的运行在CommandScheduler的run方法中,所以删除全部的断点,在run方法中打上断点,重新启动启动debug:

先看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时进入到上面的代码,停下来。

首先得到系统设备要求,依据该要求,推断是否有满足要求的设备并分配该设备。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaXRmb290YmFsbA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

原生的 要求就一个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方法:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaXRmb290YmFsbA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

传入的对象分别为ITestDevice、IConfiguration、IRescheduler。前两个已经涉及到,最后一个IRescheduler是什么?自己看吧,也没啥意义。这样任务的前期的工作都已经搞定了。程序转到了TestInvocation的invoke方法。放到下一篇文章来讲,由于它非常重要,相当于一个调度室的作用。

总结

写了6篇,总结一些cts的过程。

任务的開始点是接受命令行中的參数。假设推断为运行cts任务,那么会在Console.run方法中启动加入命令任务的线程ArgRunnable<CaptureList>和运行任务的线程CommandScheduler。加入任务线程ArgRunnable<CaptureList>会调用CommandScheduler对象方法addCommand来向ConditionPriorityBlockingQueue<ExecutableCommand>(採用先进先出的队列)这个队列中加入。而运行任务线程CommandScheduler会通过调用自己的私有方法dequeueConfigCommand来从

ConditionPriorityBlockingQueue<ExecutableCommand>去取可运行的任务,每次取第一个。

然后调用InvocationThread这个线程去运行任务。

InvocationThread这个线程调用TestInvocation.invoke方法去运行任务。

明确了么。事实上非常easy。

最新文章

  1. [SonarQube]小结
  2. UStore-自定义JDF文件格式输出
  3. Codeforces Round #333 (Div. 1) D. Acyclic Organic Compounds trie树合并
  4. D3D 模板缓存的创建过程
  5. iOS开发——UI篇Swift篇&amp;UISegmentedControl
  6. None
  7. [jQuery] Cannot read property ‘msie’ of undefined错误的解决方法
  8. 字符串 赋值 以及gets
  9. mysql xtrabackup 备份恢复实现,mysql命令备份数据库,打包压缩数据库
  10. Web Service学习笔记:动态调用WebService
  11. 旅行(LCA)
  12. php综合运用技术
  13. IOS开发之App被拒原因
  14. nyoj 回文字符串
  15. &#39;BAPI_MESSAGE_GETDETAIL&#39; 用法
  16. 同一个tomcat下面放多个项目 每个项目用不同的域名访问
  17. (转)在T-SQL语句中访问远程数据库
  18. Shell脚本 | 截取包名
  19. PHP Math 函数 mt_rand() 使用 Mersenne Twister 算法返回随机整数。
  20. C# 枚举 小总结

热门文章

  1. HDU - 5438 Ponds(拓扑排序删点+并查集判断连通分量)
  2. Python3使用PyMySQL操作数据库
  3. 【转】错误: ORA-01591: 锁被未决分布式事务处理 7.2.428982 持有--解决方案
  4. 【01】在 Github 上编辑代码
  5. 大数据学习——hive使用
  6. Ural 1960 Palindromes and Super Abilities
  7. python3--算法基础:二分查找/折半查找
  8. php引入PHPMailer发送邮件
  9. 【shell】通过shell编写ping包及arp的监控并发送短信
  10. OpenJudge 6042 雇佣兵