不推荐继承thread重写run实现生产者-消费者模式,因其违背面向对象原则、限制扩展、职责混杂、线程难复用且手动同步易出错;应使用runnable+blockingqueue+线程池。

不推荐通过继承 Thread 类并重写 run() 方法来实现生产者-消费者模式。这种方式违背面向对象设计原则,也难以保证线程安全和解耦性,实际开发中几乎不用。
为什么不该继承 Thread 重写 run?
生产者-消费者核心是**数据共享 + 协作同步**,不是单纯多线程执行逻辑。继承 Thread 会导致:
- 类只能单继承,限制扩展能力(比如无法再继承其他业务基类)
- 生产者和消费者逻辑被强行绑定到线程生命周期,职责混杂
- 无法复用线程(每次 new Thread() 开销大,且难统一管理)
- 同步控制(如 wait/notify)必须手动写在 run() 里,极易出错(比如锁对象不一致、虚假唤醒)
正确做法:用 Runnable + 阻塞队列
把生产者和消费者定义为 Runnable,交给线程池执行;用 BlockingQueue(如 ArrayBlockingQueue)自动处理线程间数据传递与阻塞等待:
示例关键代码:
// 共享缓冲区
BlockingQueue<string> queue = new ArrayBlockingQueue(10);
// 生产者
new Thread(() -> {
for (int i = 0; i {
for (int i = 0; i
<h3>如果非要继承 Thread(仅限教学演示)</h3>
<p>必须确保:<strong>共享资源独立于线程类</strong>,<strong>同步块使用同一把锁</strong>,<strong>wait/notify 成对且在 synchronized 内</strong>:</p>
<pre class="brush:java;toolbar:false;">class SharedBuffer {
private final List<string> list = new ArrayList();
private final int capacity = 5;
public synchronized void produce(String item) throws InterruptedException {
while (list.size() == capacity) wait();
list.add(item);
System.out.println("Produced: " + item);
notifyAll();
}
public synchronized String consume() throws InterruptedException {
while (list.isEmpty()) wait();
String item = list.remove(0);
System.out.println("Consumed: " + item);
notifyAll();
return item;
}
}
class Producer extends Thread {
private final SharedBuffer buffer;
Producer(SharedBuffer b) { this.buffer = b; }
public void run() {
try {
for (int i = 0; i
<p>注意:两个子类共用同一个 <code>SharedBuffer</code> 实例,所有同步操作都在它上面完成 —— 这才是关键。</p>
<h3>更现代的替代方案</h3>
<p>Java 8+ 推荐用 <code>ExecutorService</code> 管理线程,配合 <code>BlockingQueue</code> 或 <code>Phaser</code>/<code>CountDownLatch</code> 协调;复杂场景可考虑 <code>ReentrantLock</code> + <code>Condition</code> 替代 synchronized + wait/notify,控制更精细。</p></string>Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











