线程中断时继续休眠剩余时间[重复]

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 也更好。

【讨论】:

以上是关于线程中断时继续休眠剩余时间[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Thread sleep()休眠

一文搞懂 Java 线程中断

嵌套线程中断计时器[重复]

“没有绑定到线程的休眠会话”,事务方法中断下一个事务的执行

java线程中断

一文搞懂 Java 线程中断