Thread.sleep的睡眠时间少于指定的时间?

时间:2016-01-09 12:17:47

标签: java sleep thread-sleep

我试过了:

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毫秒的线程睡眠?

2 个答案:

答案 0 :(得分:1)

来自睡眠的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秒。详细了解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());
    }
}

答案 1 :(得分:0)

使用ScheduledExecutorService。这对你的程序有好处,因为你没有使用任何线程。

    ScheduledExecutorService as= Executors.newSingleThreadScheduledExecutor();
    as.scheduleAtFixedRate(new ,i,0,TimeUnit.MINUTES);