java - 线程优先级 - 'unit test'

标签 java android multithreading unit-testing

一个非常简洁的问题:我如何用一个简单的测试来证明,那个设置:

android.os.Process.setThreadPriority(int); 

真的有效吗?

我发布这个问题的原因主要是通用的,因为我找不到可以复制的简单测试。

进一步阅读:

它对我和我的应用程序特别重要,因为它捕获音频,这必须是优先事项。音频数据也会写入文件并分析其属性,这不太重要 - 因此我不要求这些任务“真正同步”。

在我的音频线程中,我设置:

Process.setThreadPriority(Process.THREAD_PRIORITY_URGENT_AUDIO);

我可以通过检查之前和之后来简单地测试上面是否“应用”了:

Process.getThreadPriority(Process.myTid());

但是,我需要测试是因为文档,which states :

Standard priority of the most important audio threads. Applications can not normally change to this priority.

尽管显示优先级更改为 -19 的日志输出,但文档中的措辞引起了我的担忧,即系统在执行时可能不允许正常应用程序使用 -19 的值,并且它是可能只为系统应用程序保留?

如果上述情况属实,我想知道如何简单地证明此优先级值会发生什么情况 - 它是默认为允许的最大值,还是可以完全忽略?

关于实际测试本身,我尝试过循环和暂停,但没有成功,我不相信我所做尝试的结果。我也知道该行为取决于操作系统,所以也许我无法复制一个独立的 Java 测试 I've failed to find any upvoted examples

希望有人能帮忙。提前致谢。

编辑 - 除了最初的答案,我很理解这种行为可能不是我想要或期望的。我想要对此进行实际的物理测试,而不是对可能性的解释。

测试将包括以不同优先级运行的多个线程,以及它们完成的顺序打印到日志中,没有比这更复杂的了。我的尝试似乎过于复杂,因此我在这里寻求帮助。

最佳答案

回答:不能。如果您正在寻找的测试有效,那并不简单。如果你想要的测试很简单,它是行不通的。

Android 不被视为“实时”操作系统,其中关于优先级的保证是硬性的(保证和可靠的)而不是软性的(建议性的并且仅很大程度上受到尊重)。在 RT O/S 中,您可以编写一个简单的测试来评估具有一个高优先级线程和一个低优先级线程的竞争条件,并且该测试将进行确定性评估。在非实时操作系统上,您只能得到统计保证。这意味着你需要一个统计测试,它不能通过简单的标准。然而,统计测试可以是通用的。编写一个测试工具,运行 N 次测试,并根据小于 N 的某个阈值通过测试。

但即使设置基础测试也并不简单。通常,调度优先级仅在机器负载运行时才重要,也就是说,当没有足够的 CPU 运行时。因此,要设置您的测试,您需要运行一些会占用 CPU 的东西;您不妨挖掘比特币以确保您的流程正在运行。如果这不是很明显,请计算挖掘尝试而不是成功。谨防过于轻易地主动屈服于操作系统(等待调用)和可以由编译器优化的操作(简单循环)。

设置基本负载后,您就可以设置高优先级线程。它还需要实际做一些事情来验证它是否以高优先级运行,所以你也可以在此线程中挖掘比特币。如果此线程以更高的优先级运行,则在给定的持续时间内,优先级较高的线程应该比较低的线程获得更高的计数。

但你可能不会。由于您不在 RT 操作系统上,因此大多数时候您只会获得更高的计数(大概)。如果持续时间太短,您将受制于调度程序的典型持续时间。因此,您可能需要进行一些实验,以确定产生一致答案的最短持续时间。

这种实验并不简单。您不在 RT 操作系统上,因此优先级的含义非常模糊。它(几乎可以肯定)没有记录,因此优先级数字的含义是任意的。调度程序如何使用这些优先级数字是他们想要的。例如,可能存在魔法阈值。如果有一个优先级意味着“永不中断;只等待 yield ”,而您运行了一个不 yield 的进程,那么您将挂起机器。由于这些优先级数字可以表示任何含义,因此您需要了解它们在实践中的含义,以使您的测试有意义。

所有这些都应该暗示为什么存在嵌入式实时操作系统市场。有时您需要时间保证,当您这样做时,您不应该使用非实时操作系统,即使它很诱人。

关于java - 线程优先级 - 'unit test',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38012256/

相关文章:

java - 使用 tcp 发送负字节

java - 为什么编译器不识别元模型属性?

android - 使用 Android MediaCodec 以不同的比特率重新编码 h.264 内容

java - Android 警报管理器不会触发我的事件

java - java ScheduledExecutorService任务在多次执行后停止

java - LDAP 多重或语法

java - 替换文本: Suggestions?中的变量

android - 从 Android Canvas 获取像素值

java - `ThreadPoolTaskExecutor` 线程在Spring执行后没有被杀死

multithreading - Pthreads 和多核编译器