用 BlockingQueue 取代手写的生产者-消费者协调代码。
代码对比
✕ Manual wait and notify
synchronized (queue) {
while (queue.isEmpty()) {
queue.wait();
}
Job job = queue.removeFirst();
process(job);
}
✓ BlockingQueue
BlockingQueue<Job> queue = new LinkedBlockingQueue<>(); Job job = queue.take(); process(job);
发现此代码有问题? 告诉我们。
为什么现代方式更好
更安全的协调
队列自身负责加锁和条件通知。
意图清晰
put() 和 take() 直接表达生产者-消费者行为。
内置策略
可选择有界容量、公平性、超时或非阻塞操作。
旧方式
手动 wait 和 notify
现代方式
BlockingQueue
自 JDK
5
难度
中级
JDK 支持
将 wait/notify 队列改为 BlockingQueue
可用
自 JDK 5 起广泛可用(2004 年)
工作原理
正确的 wait/notify 代码需要共享监视器、条件循环、匹配的通知以及对中断的仔细处理。BlockingQueue 封装了这些规则,为生产者-消费者场景提供阻塞、限时和非阻塞操作。put() 和 take() 等调用仍然可被中断。
相关文档
证明