我尝试了这个:
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毫秒的时间,因为它需要一些时间来计算
t1
和time
的值。有什么特定的原因导致它睡眠时间更少而不超过规定的时间? (我的计算机肯定不是由外星人送来的超级计算机,它将在负时间内计算t1
和time
的值!: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/