V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
ingin
V2EX  ›  问与答

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

  •  
  •   ingin · 2021-03-11 16:15:18 +08:00 · 730 次点击
    这是一个创建于 1371 天前的主题,其中的信息可能已经有所发展或是发生改变。
    class Task implements Runnable {
      @Override
      public void run() {
        while(true){
          try{
            blokingQueue.take() // 当队列没有数据,很长时间之后该线程会死亡吗?
          } catch (Exception e) {
            log.error("出现异常, {}", e); //该条语句会输出吗?
           }
        }
      }
    }
    

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

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

    ```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
        3
    ingin  
    OP
       2021-03-11 17:03:14 +08:00
    @wakzz #2 是的,您的想法和我一样,我也是这样处理的,只是想不通为什么线程长时间阻塞之后会悄无声息的死亡,死亡可以,至少在死亡之前抛出来一个异常才算合理吧!
    uselessVisitor
        4
    uselessVisitor  
       2021-03-12 08:16:53 +08:00
    @ingin 哇,感谢。。我们这边也有个一样的问题,就是某个编号发消息,如果这个编号对应的队列一直没有消息,过一段时间再向这个队列里放消息,这个线程就不会处理了。。原来是死掉了。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4770 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 03:46 · PVG 11:46 · LAX 19:46 · JFK 22:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.