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

使用ReentrantLock的Condition调用signalAll后线程未唤醒原因求助

问题根因
  • 核心错误:Start类main方法中调用t1.resume()时,实际调用的是Thread父类自带的废弃resume方法,而非你自己实现的resumeThread业务方法。这就导致t1实例的paused标记永远不会被修改为false,就算condition.signalAll()唤醒了等待队列中的所有线程,pause方法内的while(current.paused)判断会一直成立,线程会再次进入等待状态,表面看就是signalAll()完全没生效。
  • 潜在隐患:Task类的paused成员变量在run方法中赋值时没有处于锁保护范围,虽然当前场景下后续的lock.lock()操作会保证变量可见性,但如果有其他场景直接修改paused会出现多线程可见性问题。
修复方案
  1. 把main方法中的t1.resume()修改为t1.resumeThread()即可解决核心问题,两个线程都能正常被唤醒。
  2. 建议给paused变量增加volatile修饰,进一步避免多线程可见性问题:
public volatile boolean paused = false;
  1. 可选优化:Task类尽量不要直接继承Thread,改为实现Runnable接口,降低代码耦合度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 05:54:04