线程中断时继续休眠剩余时间[重复]
Posted
技术标签:
【中文标题】线程中断时继续休眠剩余时间[重复]【英文标题】:Continue sleeping for remaining time when thread is interrupted [duplicate] 【发布时间】:2019-05-11 16:56:58 【问题描述】:我有网络要求,迫使我将请求发送空闲 2 秒
requester = new Thread()
@Override
public void run()
buildRequest();
Thread.sleep(requestDelay);
catch( InterruptedException e)
// keep idle for the remaining time still
// interrupted at 1s need to sleep 1 second more
e.printStackTrace();
sendRequest();
是否有可能在循环消耗 CPU 的情况下仍然休眠剩余时间?如果是是最好的方法?
【问题讨论】:
当然可以,但最好不要睡觉。使用响应模式在几分钟后触发甚至唤醒请求 - 这样您就不会“浪费”线程。 中断不是偶然发生的。如果您的线程被中断,则有人明确要求它停止正在执行的操作并正常退出。您确定要忽略它吗? Guava 有Uninterruptibles.sleepUninterruptibly
。基本上,它只是记录线程被中断的事实,清除标志,然后重新进入睡眠状态。一旦完整时间到期,如果被中断,它将重新中断。
我知道从一开始就睡觉是个坏主意。但是考虑到这个选项,从剩余时间开始,在 catch 范围内是否适合另一个睡眠?
【参考方案1】:
如果我理解正确,您希望以这种方式处理InterruptedException
,以在执行sendRequest
之前不确定延迟。好吧,由于InterruptedException
发生在线程上调用interrupt()
时,因此该catch 块不会被执行,因此您不必担心。
您的方法不太正确,反应式方法会更好。即使是基本的Timer 也更好。
【讨论】:
以上是关于线程中断时继续休眠剩余时间[重复]的主要内容,如果未能解决你的问题,请参考以下文章