gpt4 book ai didi

java - Thread.sleep sleep 时间少于指定的时间?

转载 作者:行者123 更新时间:2023-12-01 10:36:32 29 4
gpt4 key购买 nike

我尝试过这个:

for(int i =0; i<10; i++)
{
long t1 = System.nanoTime();
try{Thread.sleep(1000);}catch(Exception e){}
double time = (System.nanoTime() - t1)/1000000;
System.out.println(i+") "+time);
}

其输出是:

0) 987.0
1) 999.0
2) 999.0
3) 999.0
4) 999.0
5) 1000.0
6) 999.0
7) 997.0
8) 999.0
9) 999.0

很明显,Thread.sleep() 并不完全准确,因为它在 10 次尝试中仅 hibernate 了 1 次 1000 毫秒。

但我认为这会花费超过1000毫秒的时间,因为需要一些时间来计算t1time的值。它 sleep 时间较短且不超过指定时间的具体原因是什么? (我的电脑当然不是外星人赐予的巨型 super 计算机,它会在负时间中计算t1time的值!:P)

此外,如何才能让线程恰好 hibernate 1000 毫秒?

最佳答案

摘自sleep的Java文档

Causes the currently executing thread to sleep (temporarily cease execution) for the specified number of milliseconds, subject to the precision and accuracy of system timers and schedulers. The thread does not lose ownership of any monitors.

正如文档所说, sleep 与底层系统有依赖性,因此在需要精度的情况下,这可能无法正常工作。

一个好的替代方案是 ScheduledExecutorService 。以下是一些有关如何使用它的代码片段:

<强>1。创建ScheduledExecutorService

public static ScheduledExecutorService createScheduledExecutorService(Runnable command){
ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
scheduledExecutorService.scheduleAtFixedRate(command, 0, 1, TimeUnit.SECONDS);
return scheduledExecutorService;
}

编辑:在这里,我将初始延迟硬编码为 0,周期为 1,TimeUnit Seconds。了解更多关于 scheduleAtFixedRate .

<强>2。创建可运行任务

public class Work implements Runnable{

@Override
public void run() {
//Do Some thing here.
}

}

<强>3。运行它

public class Main {
public static void main(String[] args)
{
ExecutorServiceFactory.createScheduledExecutorService(new Work());
}
}

关于java - Thread.sleep sleep 时间少于指定的时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34693354/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com