JAVA多线程实现生产者消费者的实例详解

发布时间 - 2026-01-11 01:48:26    点击率:

JAVA多线程实现生产者消费者的实例详解

下面的代码实现了生产者消费者的问题

Product.Java

package consumerProducer; 
 
public class Product { 
private String id; 
 
public String getId() { 
  return id; 
} 
 
public void setId(String id) { 
  this.id = id; 
} 
public Product(String id) 
{ 
  this.id=id; 
 
} 
public String toString() 
{ 
  return "product "+id;   
 
} 
 
} 

Pool.java

package consumerProducer; 
import java.util.*; 
public class Pool { 
private int number=0; 
 
private List<Product>products=new LinkedList<Product>(); 
 
 
public int getNumber() { 
  return number; 
} 
public void setNumber(int number) { 
  this.number = number; 
} 
public synchronized Product consumeProduct(){  //可以去掉synchronized关键字 
  if(products.size()>0) 
  {    Product p= products.get(0); 
    products.remove(0); 
    number--; 
    return p; 
 
  } 
  else 
    return null; 
} 
public synchronized void addProduct(Product p){  //可以去掉synchronized关键字 
       
      products.add(p); 
      number++; 
} 
 
} 

Consumer.java

package consumerProducer; 
 
public class Consumer implements Runnable { 
 private String id; 
  Pool pool; 
  public Consumer(String id,Pool pool) 
  { 
    this.id=id; 
    this.pool=pool; 
     
  } 
  @Override 
  public void run() { 
    while(!Thread.currentThread().interrupted()) 
    { 
      Product product=null; 
      synchronized(pool){ 
        while(pool.getNumber()<=0)//生产不足 
        { 
          try { 
            pool.wait();//生产者等待 
          } catch (InterruptedException e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
          } 
         
       
          
        } 
         product=pool.consumeProduct(); 
      } 
        System.out.println("consuming "+id+product.toString()); 
        try { 
          Thread.sleep(1000); 
        } catch (InterruptedException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
        } 
         
       
       
       
    } 
  } 
 
} 

Producer.java

package consumerProducer; 
 
public class Producer implements Runnable{ 
  private int i_p=0; 
  private String id; 
  Pool pool; 
  int i=0; 
  public Producer(String id ,Pool pool) 
  { 
     
    this.id=id; 
    this.pool=pool; 
  } 
  public Product createProduct() 
  { 
     
    return new Product(String.valueOf(++i_p)); 
     
  } 
  @Override 
  public void run() { 
    // TODO Auto-generated method stub 
   while(!Thread.currentThread().interrupted()) 
   { 
     Product p=new Product(String.valueOf(++i_p)); 
     try { 
      Thread.sleep(1000); 
    } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
    } 
     synchronized(pool) 
     { 
       pool.addProduct(p); 
       System.out.println("producer "+id+" adding product...."+p.toString()); 
       pool.notifyAll(); 
     }  
      
   } 
     
  } 
 
} 

Main.java

package consumerProducer; 
 
public class Main { 
 
  public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    Pool pool=new Pool(); 
   for(int i=0;i<5;i++) 
   { 
     Thread consumer=new Thread(new Consumer("consumer "+i,pool)); 
     Thread producer=new Thread(new Producer("producer "+i,pool)); 
     consumer.start(); 
     producer.start(); 
      
   } 
  } 
 
} 

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# JAVA多线程实现生产者消费者的实例详解  # java  # 线程生产者与消费者的问题  # 基于Java 生产者消费者模式(详细分析)  # Java生产者消费者模式实例分析  # Java多种方式实现生产者消费者模式  # Java实现简易生产者消费者模型过程解析  # Java编程生产者消费者实现的四种方法  # 希望能  # 谢谢大家  # 多线程  # 实现了  # number  # int  # lt  # List  # util  # Pool  # product  # import  # br  # consumeProduct  # synchronized  # remove  # size  # setNumber  # products  # gt 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 香港服务器网站卡顿?如何解决网络延迟与负载问题?  如何快速生成凡客建站的专业级图册?  如何在阿里云香港服务器快速搭建网站?  Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解  Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤  Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】  android nfc常用标签读取总结  如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)  Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理  佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】  Laravel怎么生成URL_Laravel路由命名与URL生成函数详解  如何正确下载安装西数主机建站助手?  百度输入法ai组件怎么删除 百度输入法ai组件移除工具  WEB开发之注册页面验证码倒计时代码的实现  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  C语言设计一个闪闪的圣诞树  html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】  Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置  移动端脚本框架Hammer.js  Firefox Developer Edition开发者版本入口  高端网站建设与定制开发一站式解决方案 中企动力  深入理解Android中的xmlns:tools属性  Laravel怎么判断请求类型_Laravel Request isMethod用法  如何在Windows环境下新建FTP站点并设置权限?  Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】  Laravel如何处理文件下载请求?(Response示例)  中山网站制作网页,中山新生登记系统登记流程?  奇安信“盘古石”团队突破 iOS 26.1 提权  Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】  Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理  Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用  实例解析Array和String方法  Python3.6正式版新特性预览  iOS发送验证码倒计时应用  Laravel如何实现用户注册和登录?(Auth脚手架指南)  如何在局域网内绑定自建网站域名?  Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】  如何在VPS电脑上快速搭建网站?  Laravel如何生成URL和重定向?(路由助手函数)  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  高性能网站服务器部署指南:稳定运行与安全配置优化方案  如何快速搭建安全的FTP站点?