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

求助:使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 03:50:30