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
相关产品推荐
相关产品推荐

