我尝试了这个:

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次尝试中仅睡1次就睡了1000 ms。

但是我认为这将花费超过1000毫秒的时间,因为它需要一些时间来计算t1time的值。有什么特定的原因导致它睡眠时间更少而不超过规定的时间? (我的计算机肯定不是由外星人送来的超级计算机,它将在负时间内计算t1time的值!:P)

另外,我怎样才能使线程休眠1000毫秒?

最佳答案

从Java睡眠文档


使当前正在执行的线程进入睡眠状态(暂时停止
执行)指定的毫秒数(以
系统计时器和调度程序的精度和准确性。线程
不会失去任何监视器的所有权。


正如文档所述,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.创建您的Runnable任务

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/

10-10 19:49