兄弟们,有没有遇到过 Java 线程堵塞至死的情况

2021-03-11 16:15:18 +08:00
 ingin
class Task implements Runnable {
  @Override
  public void run() {
    while(true){
      try{
        blokingQueue.take() // 当队列没有数据,很长时间之后该线程会死亡吗?
      } catch (Exception e) {
        log.error("出现异常, {}", e); //该条语句会输出吗?
       }
    }
  }
}

目前的情况是会死亡,依据:在 jconsole 中找不到该线程 catch 的异常信息并没有打印,为什么呢?

721 次点击
所在节点    问与答
4 条回复
gtexpanse
2021-03-11 16:27:30 +08:00
catch throwable 打出来看看就知道了
wakzz
2021-03-11 16:42:38 +08:00
这是睡眠太久线程给睡死了,所以我们一般是这么写的,阻塞操作给个最大睡眠时长,从而实现定时唤醒来防止线程睡死的情况。

```java
class Task implements Runnable {
@Override
public void run() {
while (true) {
try {
Object item = blokingQueue.poll(1, TimeUnit.MINUTES);
if (item == null) {
continue;
}
// TODO
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
}
}
```
ingin
2021-03-11 17:03:14 +08:00
@wakzz #2 是的,您的想法和我一样,我也是这样处理的,只是想不通为什么线程长时间阻塞之后会悄无声息的死亡,死亡可以,至少在死亡之前抛出来一个异常才算合理吧!
uselessVisitor
2021-03-12 08:16:53 +08:00
@ingin 哇,感谢。。我们这边也有个一样的问题,就是某个编号发消息,如果这个编号对应的队列一直没有消息,过一段时间再向这个队列里放消息,这个线程就不会处理了。。原来是死掉了。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/760736

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX