这是一个非常奇特的问题。我想知道在运行此 Java 程序时创建大量延迟的最佳方法。无论计算机的速度如何,我都希望这个 Java 程序会导致烦人的处理器延迟,直到程序停止。我如何保证实现这一目标?最有效的方法是什么?
到目前为止,我唯一取得适度成功的是
while (true) {}
但如果用户的计算机速度很快,即使这样有时也可能不可靠。
我正在使用它来进行一些关于一组计算机可以处理多少的科学实验。
您也可以只休眠当前线程。这不会造成延迟,但它会给程序带来这种效果。
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
您可能会欣赏我最近发布的实用程序,该实用程序解决了导致一致 GC Churn 的技术。我使用此实用程序在基准测试期间模拟系统上的负载,这听起来与您想要做的非常相似。
它在一段时间内或在后台连续创建和销毁大量对象,并且可以配置为对 JVM 施加不同程度的压力。尝试一次运行多个以增加平均数:)
完整代码可在此处获得:GC Churn Gist。
我不确定我是否完全理解您想要什么,但是您不太可能使用单线程和无休止的空循环来获得它。首先,该程序将最多使用一个系统线程,因此,使用单个 CPU 内核。其次,热点编译器可能会优化掉您的空循环(或任何算术运算或对永远不会使用的变量的赋值)。因此,无论您想要完成什么,您都需要做一些优化器不会尝试改进的事情。所以...
如果你想减慢一个程序(而不是计算机)的执行速度,那就散布一些Thread.sleep(1000)。JVM 将把时间交还给操作系统。
如果您的意图是让 JVM 在等待某些外部事件时做一些工作(如“计算系统的 bogomips”),那么您应该运行会产生副作用的代码,以便优化器不会删除无用的变量分配。例如,您可以对数组进行一些算术运算,然后 System.out.print() (或其他任何东西......)来自该数组的任何值。但是请注意,您的进程仍将仅限于单个线程,并且如果您的进程长时间不执行 IO 操作,那么它很可能会被操作系统降低优先级,因此不要期望这种类型的可靠性太高测量技术。
如果您正在考虑停止整个系统,那么您必须运行多个线程,并让它们执行密集的内存分配、IO 操作或外部程序执行。例如,您可能会运行数千个线程,每个线程都运行一个循环,该循环执行一个分配巨大缓冲区的外部 Java 程序,然后将该缓冲区的内容写入文件……嗯,你明白了;)