多线程---生产者消费者模式

生产者消费者模式

在Java中,负责产生数据的模块是生产者,负责使用数据的模块是消费者,生产者消费者解决数据的平衡问题。即先有数据然后才能使用,没有数据时,消费者需要等待。

 

 

 

 

 

案例:

package com.mokuiran.thread.pcquestion;


public class PCTest{
   public static void main(String[] args) {
       //测试消费者生产者
       ValueOP valueOP = new ValueOP();
       ProductorThread p = new ProductorThread(valueOP);
       ConmuserThread c = new ConmuserThread(valueOP);//从valueOP对象中读取数据

       p.start();
       c.start();

  }
}


class ValueOP{
   private String value = "";//定义一个空的字符串

   //定义方法修改value字段的值(模拟生产者生产数据)
   public void setValue(){
       synchronized (this){
           //如果value值不是空串("")就等待
           while (!value.equalsIgnoreCase("")){
               try {
                   this.wait();
              } catch (InterruptedException e) {
                   e.printStackTrace();
              }
          }
           //如果value字段值是空串,就设置value字段的值
           String value = System.currentTimeMillis()+"-"+System.nanoTime();
           System.out.println("set设置的值是:"+value);
           this.value = value;
//           this.notify();   //在多生产者多消费者环境中,notify()不能保证是生产者唤醒消费者,如果生产者唤醒的还是生产者可能会出现假死的情况
           this.notifyAll();
      }
  }
   //定义方法读取字段(模拟消费者消费数据)
   public void getValue(){
       synchronized (this){
           //如果value是空串就等待
           while (value.equalsIgnoreCase("")){
               try {
                   this.wait();
              } catch (InterruptedException e) {
                   e.printStackTrace();
              }
          }
           //不是空串,就读字段值
           System.out.println("get的值为:"+this.value);
           this.value = "";//读完之后重新将value值赋空值
           this.notifyAll();
      }
  }
}


class ProductorThread extends Thread{
   //调用生产者(setValue()方法)
   private ValueOP obj;

   ProductorThread(ValueOP obj){
       this.obj = obj;
  }

   @Override
   public void run() {
       while (true){
           obj.setValue();
      }
  }
}


class ConmuserThread extends Thread{
   //调用消费者(getValue()方法)
   private ValueOP obj;

   ConmuserThread(ValueOP obj){
       this.obj = obj;
  }

   @Override
   public void run() {
       while (true){
           obj.getValue();
      }
  }
}

//最终结果:
//无限循环,一边生产一边消费
posted @   默夔然  阅读(122)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示