查看: 2962| 回复: 5
跳转到指定楼层
上一主题 下一主题
收起左侧

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

全局:

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

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

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.







上一篇:Oracle面试题:convert sorted array to bst in iterative way 求解
下一篇:LC 字典树这两个时间空间复杂度分别是多少?谢谢
🔗
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完全可以吧。我只是想表达“粗到精逼近”这么个思想。事实上可以根据具体闹钟所需定时的长度来选择 ...

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

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

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