当前位置: 首页 > 知识库问答 >
问题:

java - 已经捕获了异常,为什么运行几天后,程序还是发生了死锁呢?

桓瀚
2024-06-08

运行2天左右,就会发生一次死锁
线程都在外面等着,进入不了try块内部

    public  void  sapGoodsMove(String factoryCode, List<OdsRawMission> list, String oprType) {        try {            if (lock.tryLock(120, TimeUnit.SECONDS)) { // 尝试获取锁,最多等待120秒                try {                    List<OdsRawMission> orderRawMissions = new ArrayList<OdsRawMission>();                    orderRawMissions = odsRawOrderTaskMapper.queryTransferList311(factoryCode,list);                    log.info(factoryCode+":交接完成待过账数据:{}条",orderRawMissions.size());                    if(orderRawMissions.size()>0){                        sap(sapHost,factoryCode,orderRawMissions);                    }                } catch (Exception e) {                    log.error("原材料交接过账异常",e);                }            } else {                log.info(factoryCode+":未抢到锁:" + list);            }        } catch (InterruptedException e) {            Thread.currentThread().interrupt(); // 保持中断状态            log.error("获取锁时被中断", e);        } finally {            if (lock.isHeldByCurrentThread()) { // 确保只有持有锁时才解锁                lock.unlock();            }        }    }

这是调用处的代码1

 @Scheduled(cron = "0 0/15 * * * ?")    public void executeGoodsMove() {        log.info("task-raw-jiaojie-sap");        if (!Boolean.parseBoolean(enable)) {            return;        }        if (profile.indexOf("russia") < 0) {            String[] split = factoryCodes.split(",");            for (String factoryCode : split) {                ThreadPool.executeTask(() -> {                    try {                        dbCommon.execute(factoryCode);                        if (DictionaryConstant.PLANT_YDGC.contains(factoryCode)) {//印度工厂                            postHandoverServiceIndia.sapGoodsMove(factoryCode, null,"task");                        }                    } catch (Exception e) {                        e.printStackTrace();                        log.error("原材料交接 过账异常:{}", e.getMessage());                    }                });            }        }    }

共有1个答案

申黎明
2024-06-08

可以试试把锁放在业务逻辑之后立刻释放

public  void  sapGoodsMove(String factoryCode, List<OdsRawMission> list, String oprType) {        try {            if (lock.tryLock(120, TimeUnit.SECONDS)) { // 尝试获取锁,最多等待120秒                try {                    List<OdsRawMission> orderRawMissions = new ArrayList<OdsRawMission>();                    orderRawMissions = odsRawOrderTaskMapper.queryTransferList311(factoryCode,list);                    log.info(factoryCode+":交接完成待过账数据:{}条",orderRawMissions.size());                    if(orderRawMissions.size()>0){                        sap(sapHost,factoryCode,orderRawMissions);                    }                } catch (Exception e) {                    log.error("原材料交接过账异常",e);                } finally {                    lock.unlock(); // 业务逻辑处理后立即释放锁                }            } else {                log.info(factoryCode+":未抢到锁:" + list);            }        } catch (InterruptedException e) {            Thread.currentThread().interrupt(); // 保持中断状态            log.error("获取锁时被中断", e);        }    }
 类似资料:
  • 问题内容: 我的应用程序在Linux上作为后台进程运行。当前在“终端”窗口的命令行中启动。 最近,一个用户执行该应用程序一段时间后,它神秘地死了。文本: 被杀 在航站楼上。这发生了两次。我问其他终端是否有人使用kill命令杀死进程?没有。 Linux在什么情况下会决定终止我的进程?我相信外壳程序显示为“ killed”,因为该进程在收到kill(9)信号后就死了。如果Linux发送了kill信号,

  • 死锁描述了另外两个线程因为永远等待对方而被阻塞的情况。当死锁发生时,程序永远挂起,你唯一能做的就是杀死程序。 为什么在下面给出的示例生产者-消费者问题中没有发生死锁: 我想知道为什么当同步对象正在等待其他线程释放锁时,在同步块中调用等待方法不会导致死锁?

  • 问题内容: 我有一个客户端服务器程序在服务器端使用套接字,并且读写发生在这种方式 同样在cilent(android)方面… 问题是,建立连接后,程序会卡住它们,没有错误,也没有异常。停下来 问题答案: 这是一个死锁,您必须首先创建并刷新ObjectOutputStream。这是因为ObjectInputStream在继续操作之前先读取OOS发送的标头。

  • 问题内容: 我正在学习Go,并且正在通过GoTours 学习此课程。到目前为止,这就是我所拥有的。 如您所见,我尝试通过打印输出到通道中的值来测试Walk函数。但是,出现以下错误。 我认为应该会出现此错误,因为我从不使用该通道。但是,有没有一种方法可以“捕获”此死锁错误并以编程方式对其进行处理? 问题答案: 死锁类似于nil指针引用,它表示程序中的一个BUG。因此,此类错误通常无法恢复。 如lbo

  • 问题内容: 最近,我们在Java服务器应用程序中遇到了一个问题,该应用程序正在抛出未捕获的错误,因为Error是Throwable的一个单独的子类,而我们仅捕获了Exceptions。 我们通过捕获Throwables而不是Exceptions解决了眼前的问题,但这使我思考为什么您要捕获Exceptions而不是Throwables,因为您随后会错过Errors。 那么, 当您可以捕获Throwa

  • 问题内容: 通常,如果有任何类extends ,它将成为检查异常。还扩展了Exception。那么它是如何? 难道他们在这种特殊情况下会在 编译器中 自定义检查? 编辑: 我对已 检查的v / s未检查的异常 以及它们的优缺点等有适当的了解。我不接受它们之间的区别。 问题答案: 在规范的第11.1.1节中有明确规定: 及其所有子类共同是 运行时异常类 。 在 未经检查的异常类 是运行时异常类和错误