对于模拟,我不会尝试实时模拟,因为这不会给您可重复的结果。即你不能测试你的模拟。
相反,我会使用数据驱动的模拟时钟,并尽可能快地运行所有内容。这为您提供了可重现的结果,并允许您比实时更快地模拟(例如快 2 倍到 100 倍)
怀疑一个线程大约需要 10 微秒。尝试将线程挂起的时间少于此时间是没有意义的。
要忙等待一小段时间,可以试试。
long start = System.nanoTime();
while(start + delay >= System.nanoTime());
注意:正如@EugeneBeresovsky 评论的那样,在您的机器运行 292 年后,这可能会溢出,因此您可以选择将其写为
while(System.nanoTime() - start < delay);
这将适用于少于 292 年的延迟。您可以使用 System.currentTimeMillis() 进行更长的延迟。
然而,即使这样也不可靠,因为 System.nanoTime() 在 Centos 5.x 上最多可能需要 300 ns,因此调用它两次将需要比 100 ns 长得多的时间。此外,许多操作系统的分辨率仅为 1000 ns(1 微秒),因此无论您要寻找的延迟如何,此循环都将等待长达 1 微秒。
相反,您可以做的是在未优化的短循环中忙于等待。
对于 100 ns 的延迟,我怀疑最好是忙于等待您正在等待的任何内容,而不是创建一个单独的忙循环。