【发布时间】:2016-10-27 00:08:33
【问题描述】:
一个非常简洁的问题:我如何通过一个简单的测试来证明该设置:
android.os.Process.setThreadPriority(int);
真的有效吗?
我发布这个问题的原因主要是通用的,因为我找不到可以复制的简单测试。
延伸阅读:
这对我和我的应用程序特别重要,因为它捕获音频,这必须是优先事项。音频数据也被写入文件并对其属性进行分析,这不太重要 - 因此我不要求这些任务“真正同时”。
在我的音频线程中,我设置:
Process.setThreadPriority(Process.THREAD_PRIORITY_URGENT_AUDIO);
我可以通过检查之前和之后简单地测试上述是否“应用”:
Process.getThreadPriority(Process.myTid());
但是,我需要测试是由于文档,which states:
最重要的音频线程的标准优先级。应用 通常无法更改为此优先级。
尽管日志输出显示优先级更改为 -19,但文档中的措辞引起了我的担忧,即系统在执行时可能不允许正常应用程序的值 -19,它是可能只保留给系统应用程序?
如果上述情况属实,我想知道如何简单地证明这个优先级值会发生什么 - 它是默认为允许的最大值,还是可以完全忽略?
关于实际测试本身,我已经尝试过循环和暂停,但没有成功,我不相信我所做的尝试的结果。我也知道该行为取决于操作系统,所以也许我无法复制 I've failed to find any upvoted examples 的独立 Java 测试?
希望有人可以提供帮助。提前致谢。
编辑 - 除了最初的答案,我很感激这种行为可能不是我想要或期望的。我想要实际的物理测试,而不是解释可能性。
测试将包含以不同优先级运行的多个线程,并将它们完成的顺序打印到日志中,没有比这更复杂的了。我的尝试似乎过于复杂,因此我在这里寻求帮助。
【问题讨论】:
-
除非您知道它的含义,否则您无法证明它“有效”。我现在不知道它在 Android 中的具体含义,但在大多数非实时操作系统中,它的含义相当软:类似于,如果两个线程相互竞争 CPU 时间,一个与更高的“优先级”将获得更大的时间份额。但请注意!如果您的测试没有比硬件 CPU 内核更多的可运行线程,那么这些线程实际上不会竞争。
-
@jameslarge 我在 Android 设备上看到的最大内核数是 4,网上的数量是
Runtime.getRuntime().availableProcessors()所以我希望这不会成为问题。 -
通过单元测试可以做的最好的事情是验证您的应用设置了正确的优先级值。通过集成测试,您可以验证您的应用是否设置了该值,然后(可能)从操作系统检索优先级值并确认它已设置。
-
@DwB 但我可以以不同的优先级运行测试,并且在所有条件相同的情况下,查看它在中间完成的其他线程的优先级
-
所有这些讨论都让我要求澄清一下。为什么你完全关心优先级?您试图通过设置优先级来避免哪些不良行为?如果你能回答这个问题,你就可以开始考虑如何用定量(换句话说,可测试的)术语来指定你要寻找的东西。
标签: java android multithreading unit-testing