Android怎么进行精确的sleep?

zhuzhu101011 2011-08-16 10:23:36
问几个问题
1. java端可以实现精确的sleep么?
2. thread.sleep 和 SystemClock.sleep 的精度咋样?
3. SystemClock.sleep接受毫秒单位,但是它能精确到1毫秒么?
4. Thread.sleep(millis, nanos) 单位到了纳秒, 实际能精确到多少?
5. 这些sleep的计算是基于系统日期时间还是基于cpu时间的?
...全文
3001 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
cxxy328 2012-02-15
  • 打赏
  • 举报
回复
谁给个sleep实例啊
ameyume 2011-08-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fontlose 的回复:]

1 做不到那么精准的 系统调度和内部硬件中断都会影响
2 SystemClock.sleep 源码上也是调用thread.sleep来的只是不会抛出异常在里面做了。
Java code

/**
* Waits a given number of milliseconds (of uptimeMillis) before returning.
* Simila……
[/Quote]
学习。
windows上的timer也不转,貌似是由cpu的频率决定的。
念茜 2011-08-16
  • 打赏
  • 举报
回复
linux下的sleep不可能非常精确,sleep最终会调用到schedule_timeout(),就是给cpu上timer,然后调度出去,让出cpu的资源,等timer到时间,再调度回来申请使用cpu资源,两次调度花费的时间不能准确的确定,所以睡眠时间也不准确
yylmal 2011-08-16
  • 打赏
  • 举报
回复
顶一顶吧
zhuzhu101011 2011-08-16
  • 打赏
  • 举报
回复
其实我现在的精度要求是10ms, 是在重绘的循环里, 想定义成10ms一帧这个样子, 但是觉得精度好像还是不太够, 循环还会累计误差, 在考虑还要不要使用帧这种设置
yuhuaijun 2011-08-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fontlose 的回复:]
1 做不到那么精准的 系统调度和内部硬件中断都会影响
2 SystemClock.sleep 源码上也是调用thread.sleep来的只是不会抛出异常在里面做了。

Java code


/**
* Waits a given number of milliseconds (of uptimeMillis) before returning.
* ……
[/Quote]

学习一下!!!
yuhuaijun 2011-08-16
  • 打赏
  • 举报
回复
一般用 Thread.sleep, 其他的暂时还未用过,
这个精确度还要取决于当前任务的优先级,这个应该是由系统决定的,
fontlose 2011-08-16
  • 打赏
  • 举报
回复
1 做不到那么精准的 系统调度和内部硬件中断都会影响
2 SystemClock.sleep 源码上也是调用thread.sleep来的只是不会抛出异常在里面做了。

/**
* Waits a given number of milliseconds (of uptimeMillis) before returning.
* Similar to {@link java.lang.Thread#sleep(long)}, but does not throw
* {@link InterruptedException}; {@link Thread#interrupt()} events are
* deferred until the next interruptible operation. Does not return until
* at least the specified number of milliseconds has elapsed.
*
* @param ms to sleep before returning, in milliseconds of uptime.
*/
public static void sleep(long ms)
{
long start = uptimeMillis();
long duration = ms;
boolean interrupted = false;
do {
try {
Thread.sleep(duration);
}
catch (InterruptedException e) {
interrupted = true;
}
duration = start + ms - uptimeMillis();
} while (duration > 0);

if (interrupted) {
// Important: we don't want to quietly eat an interrupt() event,
// so we make sure to re-interrupt the thread so that the next
// call to Thread.sleep() or Object.wait() will be interrupted.
Thread.currentThread().interrupt();
}
}



3 同1
4 实际能精确到多少 看CPU的工作频率,频率越高精度也越大,还要看运行时有没被其他任务抢占。
5 sleep基于cpu时间的,看上面代码用的是uptimeMillis()开机时启动到现在的时间来计算的,系统挂起sleep也会停止计算。
zhuzhu101011 2011-08-16
  • 打赏
  • 举报
回复
大家来讨论&领分吧
zhuzhu101011 2011-08-16
  • 打赏
  • 举报
回复
貌似在非实时系统中, 由于系统进程调度的问题, 精确到1ms以下是做不到的... sigh
zhuzhu101011 2011-08-16
  • 打赏
  • 举报
回复
能提供官方的资料来源最好了
小边3310903 2011-08-16
  • 打赏
  • 举报
回复
学习下,不清楚~~
zhuzhu101011 2011-08-16
  • 打赏
  • 举报
回复
在实际项目中测试 误差有时要大好多 sleep(1)误差甚至可超过10ms
zhuzhu101011 2011-08-16
  • 打赏
  • 举报
回复
上面的实际是sleep了19次和199次的耗时 结果差不多
zhuzhu101011 2011-08-16
  • 打赏
  • 举报
回复
以下是真机调试的数据:

08-16 12:55:34.023: DEBUG/Hello(22257): time:0
08-16 12:55:34.023: DEBUG/Hello(22257): 10
08-16 12:55:34.023: DEBUG/Hello(22257): 20
08-16 12:55:34.023: DEBUG/Hello(22257): 30
08-16 12:55:34.023: DEBUG/Hello(22257): 41
08-16 12:55:34.023: DEBUG/Hello(22257): 51
08-16 12:55:34.023: DEBUG/Hello(22257): 61
08-16 12:55:34.023: DEBUG/Hello(22257): 71
08-16 12:55:34.023: DEBUG/Hello(22257): 81
08-16 12:55:34.023: DEBUG/Hello(22257): 92
08-16 12:55:34.023: DEBUG/Hello(22257): 102
08-16 12:55:34.023: DEBUG/Hello(22257): 113
08-16 12:55:34.023: DEBUG/Hello(22257): 123
08-16 12:55:34.023: DEBUG/Hello(22257): 133
08-16 12:55:34.023: DEBUG/Hello(22257): 143
08-16 12:55:34.023: DEBUG/Hello(22257): 154
08-16 12:55:34.023: DEBUG/Hello(22257): 164
08-16 12:55:34.023: DEBUG/Hello(22257): 174
08-16 12:55:34.023: DEBUG/Hello(22257): 184
08-16 12:55:34.023: DEBUG/Hello(22257): 194



代码:

TextView tv = new TextView(this);
long start=System.nanoTime();
String s = "time:";
for (int i=0; i<20; i++) {
long now=System.nanoTime();
SystemClock.sleep(10);
s += String.valueOf((now-start)/1000000) + " \n";
}
tv.setText( s );
Log.d("Hello", s);



延迟有2%
用200次测试了一下 理论2000ms,实际2059ms,延迟3%

80,471

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧