这是一个非常特殊的问题。我想知道在运行这个Java程序时创建大量延迟的最佳方法。无论计算机的速度如何,我都希望这个Java程序在程序停止之前引起恼人的处理器延迟。我如何保证实现这一目标?什么是最有效的方法?
到目前为止,我唯一能够取得成功的是
while (true) {}
但是,如果用户的计算机速度很快,有时甚至可能不可靠。
我正在使用它来执行一组计算机可以处理的科学实验。
答案 0 :(得分:0)
你也可以只是睡觉当前的线程。这不会产生延迟,但它会给程序带来影响。
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
答案 1 :(得分:0)
您可能会感谢我最近发布的解决Techniques for causing consistent GC Churn的实用程序。我使用此实用程序在基准测试期间模拟系统上的负载,这听起来与您希望的相似。
它会在一段时间内创建并销毁大量对象,或者在后台持续创建和销毁大量对象,并且可以配置为在JVM上施加不同程度的压力。尝试一次运行几个是额外的意思:)
完整代码可在此处找到:GC Churn Gist。
答案 2 :(得分:0)
我不确定我到底知道你想要什么,但你不可能使用一个sungle线程和一个无尽的空循环来获得它。首先,该程序将使用最多一个系统线程,因此,单个CPU核心。其次,热点编译器可能会优化您的空循环(或任何算术运算或对永远不会使用的变量的赋值)。因此,无论您想要实现什么,您都需要做一些优化器不会尝试改进的事情。所以......
如果你想减慢程序的执行速度(而不是计算机),那么就在一些Thread.sleep(1000)周围传播。 JVM会将这段时间反馈给操作系统。
如果你的目的是让JVM在等待一些外部事件时做一些工作(如“计算系统的bogomips”),那么你应该运行会产生副作用的代码,这样优化器就不会删除无用的变量分配。例如,您可以对数组执行一些算术运算,然后对System.out.print()(或其他任何...)执行该数组中的任何值。但请注意,您的进程仍将仅限于一个线程,并且如果您的进程长时间不执行IO操作,那么它很可能会被操作系统解除优先级,因此不要期望该类型的可靠性过高。测量技术。
如果您正在考虑停止整个系统,那么您必须运行多个线程,并让它们执行密集内存分配,IO操作或外部程序执行。例如,您可以运行数千个线程,每个线程运行一个执行外部Java程序的循环,该程序分配大量缓冲区,然后将该缓冲区的内容写入文件......好吧,您明白了;)