一亩三分地论坛

 找回密码
 获取更多干货,去instant注册!

扫码关注一亩三分地公众号
查看: 1434|回复: 5
收起左侧

[其他] 请教一下经常看到的multi-thread scheduler的问题

[复制链接] |试试Instant~ |关注本帖
七夜雪 发表于 2015-12-3 09:04:53 | 显示全部楼层 |阅读模式

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看,没有帐号?获取更多干货,去instant注册!

x
题目的描述在这里: http://www.1point3acres.com/bbs/ ... D311%26sortid%3D311

比如说如果闹钟是这样的:
public class Alarm{
    public long getAlarmTime(){}    //time in ms
    public long setAlarmTime(){}
}


这个scheduler是不是应该用一个PriorityQueue<Alarm> pq,然后comparator就是alarm的时间。要检查闹钟时间是不是到了应该用个while loop:
while(true){
    long currentTime=getCurrentTime();
    long nextAlarmTime=pq.peek().getAlarmTime();
    if(currentTime<nextAlarmTime)
         try{
              Thread.sleep(1000);
         }catch InterruptedException(e){//handle exception}
    else
         pq.poll().showAlarm();
}
我想问的是,这种方法对嘛?还有Thread.sleep(1000);这里,我觉得比较有效率的可能是Thread.sleep(nextAlarmTime-currentTime);但是考虑Thread.sleep()无法保证真正这个thread到底会休眠多久,所以感觉每一秒check一下更安全,但是这样就要不停的check.






stellari 发表于 2015-12-5 20:05:27 | 显示全部楼层
要不这样,比如nextAlarmTime-currentTime是24000ms,那么就先让线程睡一半时间,即12000ms。假设线程实际13000ms后才醒,那么还剩11000ms,然后再睡11000/2 = 5500ms. 线程可能6000ms后才醒,还有5000ms,然后再睡2500ms,结果这次线程调度时卡了一下,睡了4000ms,醒来时发现只剩1000ms。于是干脆不睡了,就开一个循环一直检查CPU时间,到时间马上叫人起床。

这样,在T时间内,线程的时间执行时间是k*log(T) + T'。其中T'是最后决定不睡的那段时间的阈值。这样能够在一定程度上减小睡过的概率,而CPU占用比起纯polling来也有不小的改进。

另,我本人有时在精神非常紧张的情况下,很有可能也是采用这种睡眠模式……
回复 支持 反对

使用道具 举报

 楼主| 七夜雪 发表于 2015-12-6 02:39:05 | 显示全部楼层
stellari 发表于 2015-12-5 20:05
要不这样,比如nextAlarmTime-currentTime是24000ms,那么就先让线程睡一半时间,即12000ms。假设线程实际1 ...

有道理!谢谢大神!

我也是。。。比如第二天有重要的事准备8点起床,我就6点醒来,决定继续睡,6点45又醒来,睡,7点10分醒。。。然后就决定不睡了。。。
回复 支持 反对

使用道具 举报

mchzh 发表于 2015-12-6 08:04:40 | 显示全部楼层
计算出离闹钟需要闹的时间差后,不能一次性休眠更多吗?比如时间差的9/10,折半是不是也是有点次数多呢,或者还有更精确的需求?
回复 支持 反对

使用道具 举报

stellari 发表于 2015-12-6 23:05:10 | 显示全部楼层
mchzh 发表于 2015-12-6 08:04
计算出离闹钟需要闹的时间差后,不能一次性休眠更多吗?比如时间差的9/10,折半是不是也是有点次数多呢,或 ...

取9/10完全可以吧。我只是想表达“粗到精逼近”这么个思想。事实上可以根据具体闹钟所需定时的长度来选择休眠时间占总时间的百分比。

我很想知道真正的这类系统中是如何实现精确计时的。Java的Sleep的精确度受操作系统线程调度负载,优先级等多种因素影响,睡过的可能性很大。即使用上面的方法逼近,在极端情况下还是有可能会睡过;如何能够保证绝对不会睡过呢?
回复 支持 反对

使用道具 举报

mchzh 发表于 2015-12-7 02:00:50 | 显示全部楼层
stellari 发表于 2015-12-6 23:05
取9/10完全可以吧。我只是想表达“粗到精逼近”这么个思想。事实上可以根据具体闹钟所需定时的长度来选择 ...

必须有个线程能够一直监听着才能保证不错过吧,就像定时任务一样,调用第三方定时器软件,到了时间后就发起闹钟任务,只不过监控时间的程序没有自己写
回复 支持 反对

使用道具 举报

本版积分规则

请点这里访问我们的新网站:一亩三分地Instant.

Instant搜索更强大,不扣积分,内容组织的更好更整洁!目前仍在beta版本,努力完善中!反馈请点这里

关闭

一亩三分地推荐上一条 /5 下一条

手机版|小黑屋|一亩三分地论坛声明 ( 沪ICP备11015994号 )

custom counter

GMT+8, 2016-12-4 06:19

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

快速回复 返回顶部 返回列表