求助:使用wait/notify实现交替生产者-消费者线程执行顺序异常
问题分析与修复方案
你的代码核心问题在于容器类的初始状态错误,导致生产者和消费者的初始逻辑混乱,同时可以优化细节来保证严格交替执行。
核心错误修正
1. 容器初始状态错误
Container类中empty的初始值应该设为true——容器一开始是空的,生产者可以立即生产,消费者需要等待生产者完成生产后才能消费。
原错误代码:
private boolean empty= false;
修正后:
private boolean empty= true;
2. 中断状态重置(可选但推荐)
在wait()的catch块中,建议重置线程的中断状态,避免丢失中断信号:
catch(InterruptedException e) { Thread.currentThread().interrupt(); }
完整修正后的容器类代码
public class Container { private int Contenu; private boolean empty= true; // 容器初始为空 public synchronized int prendre() { while(empty) { try{ wait(); } catch(InterruptedException e) { Thread.currentThread().interrupt(); } } empty = true; notify(); return Contenu; } public synchronized void mettre(int valeur) { while(!empty) { try{ wait(); } catch(InterruptedException e) { Thread.currentThread().interrupt(); } } Contenu = valeur; empty = false; notify(); } }
为什么原代码顺序随机?
原代码中empty初始为false,容器被错误标记为“非空”:
- 第一个生产者调用
mettre()时,会因empty==false进入wait()等待; - 消费者调用
prendre()时,直接取走未初始化的Contenu(值为0),标记容器为空并唤醒生产者; - 后续线程调度的随机性,导致生产和消费顺序混乱。
修正后,容器初始为空,生产者先完成生产并唤醒消费者,消费者消费后唤醒生产者,以此严格交替执行。
额外说明
生产者线程中的sleep()是生产后的延迟操作,不会破坏交替逻辑——生产者完成生产并唤醒消费者后,即使进入休眠,消费者仍会执行消费操作,消费完成后等待生产者休眠结束继续生产,整体保持交替顺序。
内容的提问来源于stack exchange,提问作者Azzedine Bk
相关产品推荐
相关产品推荐

