You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java线程notifyAll()异常等待:代码无计算输出求助

问题根源分析

你这段代码的核心问题是你从来没有启动过Totalizer线程!三个Tester线程都在等着Totalizer完成计算并调用notifyAll()来唤醒它们,但Totalizer的run()方法根本没机会执行——相当于你雇了三个快递员等着取货,但仓库里根本没人备货,快递员只能一直等下去,自然看不到计算结果输出。

修复步骤

1. 启动Totalizer线程

在main方法里新增启动Totalizer线程的代码,因为Totalizer实现了Runnable,需要用Thread包装后启动:

public static void main(String[] args){
    Totalizer t = new Totalizer();
    // 新增:启动负责计算的Totalizer线程
    new Thread(t).start();
    new Tester(t).start();
    new Tester(t).start();
    new Tester(t).start();
}

2. 不要空吞中断异常(可选但推荐)

你代码里直接空捕获了InterruptedException,这会掩盖调试信息,建议至少打印异常并恢复线程中断状态:

catch (InterruptedException e) {
    e.printStackTrace();
    Thread.currentThread().interrupt(); // 恢复中断标记,避免后续逻辑忽略中断
}
额外知识点补充
  • wait()、notify()/notifyAll()必须在持有对象锁的场景下调用,你这部分代码的锁使用是正确的,这点没问题。
  • 调用wait()时,线程会释放持有的锁并进入等待队列,直到其他线程调用同一个对象的notify()/notifyAll()唤醒它。
  • 如果没有线程去唤醒等待中的线程,这些线程会一直处于阻塞状态,也就是你当前遇到的“卡住”情况。

内容的提问来源于stack exchange,提问作者1m9K

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:14:27