我试过了:
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毫秒的线程睡眠?
答案 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);