【问题标题】: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 范围内是否适合另一个睡眠?

标签: java multithreading sleep


【解决方案1】:

如果我理解正确,您希望以这种方式处理InterruptedException,以在执行sendRequest 之前不确定延迟。好吧,由于InterruptedException 发生在线程上调用interrupt() 时,因此该catch 块不会被执行,因此您不必担心。

您的方法不太正确,反应式方法会更好。即使是基本的Timer 也更好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    • 2019-04-03
    • 2014-06-01
    相关资源
    最近更新 更多