第一步,定义一个商品类。
package com.moon.thread; /** * * @author cenyuan * 商品类 */ public class Product { private String name; private String id; public Product() { } public Product(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getId() { return id; } public void setId(String id) { this.id = id; } } 第二步,定义仓库类
package com.moon.thread; /** * * @author cenyuan * 仓库类 */ public class Storage { private String name ;//仓库名字 private String id; //仓库编号 private static final int MAX_STORAGE_NUM = 10;//仓库的最大容量 private static final int MIN_STORAGE_NUM = 1 ;//仓库的最小容量 private Product[] products;//商品集 private int size=0; //商品集大小 public Storage() { products = new Product[MAX_STORAGE_NUM]; } public synchronized Product put(Product prod) { //System.out.println("MAX_STORAGE_NUM < size="+(MAX_STORAGE_NUM < size)); if(MAX_STORAGE_NUM < size) { try { System.out.println(Thread.currentThread()+"等待消费者消费!"); this.wait();//如果商品集已经超过仓库的容量则生产者线程等待 } catch (InterruptedException e) { System.out.println("当生产产品" + prod.getName()+"出现错误"); e.printStackTrace(); } } else { System.out.println("开始生产" + prod.getName()); products[size] = prod; size++; System.out.println("仓库里面有 = " +size + "产品"); this.notifyAll(); } return prod; } public synchronized Product get() { Product prod = null; //System.out.println("MIN_STORAGE_NUM > size : " + MIN_STORAGE_NUM +">" +size); if(MIN_STORAGE_NUM > size) { try { System.out.println(Thread.currentThread()+"等待生产者生产!"); this.wait();//如果商品集已经小于仓库的最小容量则消费者线程等待 } catch (InterruptedException e) { System.out.println("当消费产品时出现错误"); e.printStackTrace(); } } else { size--; prod = products[size]; //System.out.println("开始消费" + prod.getName()); System.out.println(Thread.currentThread()+"已消费,现在仓库里面有 = " +size + "产品"); this.notifyAll(); } return prod; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getId() { return id; } public void setId(String id) { this.id = id; } }
第三步,定义生产者类
package com.moon.thread; /** * * @author cenyuan * 生产者类 */ public class Producter implements Runnable{ private String name; private Storage storage; public void create() throws InterruptedException { for(int i=0;;i++) { Thread.sleep(800); // System.out.println("Producter Current Thread : " + Thread.currentThread()); Product prod = new Product("Book "+i); // System.out.println(name + "准备生产产品:"+prod.getName()); storage.put(prod); } } public String getName() { return name; } public void setName(String name) { this.name = name; } public Storage getStorage() { return storage; } public void setStorage(Storage storage) { this.storage = storage; } public Producter(String name,Storage storage) { this.storage = storage; this.name = name; } @Override public void run() { try { create(); } catch (InterruptedException e) { System.out.println("生产时出现错误!"); // TODO Auto-generated catch block e.printStackTrace(); } } }
第四步,定义一个消费者类
package com.moon.thread; /** * * @author cenyuan * 消费者类 */ public class Customer implements Runnable{ private String name; private Storage storage; public void cust() throws InterruptedException { while(true) { Thread.sleep(500); //System.out.println("Customer Current Thread : " + Thread.currentThread()); //System.out.println(name + "准备消费产品:"); Product prod = storage.get(); if(prod!=null) System.out.println(name + "消费产品:"+prod.getName()+" 结束"); } } public String getName() { return name; } public void setName(String name) { this.name = name; } public Storage getStorage() { return storage; } public void setStorage(Storage storage) { this.storage = storage; } public Customer(String name,Storage storage) { this.name = name; this.storage = storage; } @Override public void run() { try { cust(); } catch (InterruptedException e) { System.out.println("消费时出现错误!"); // TODO Auto-generated catch block e.printStackTrace(); } } }
第五步 定义一个测试类
package com.moon.thread; public class Tester { /** * @param args */ public static void main(String[] args) { Storage storage = new Storage(); Producter proder1 = new Producter("王杰",storage); Producter proder2 = new Producter("蒋东",storage); Customer cu1 = new Customer("胡株",storage); Customer cu2 = new Customer("何德",storage); Customer cu3 = new Customer("张三",storage); Thread thread1 = new Thread(proder1,"王杰"); Thread thread2 = new Thread(cu3,"张三"); Thread thread3 = new Thread(cu1,"胡株"); Thread thread4 = new Thread(cu2,"何德"); thread3.start(); thread1.start(); thread2.start(); thread4.start(); System.out.println("Main thread end !"); } }
相关推荐
java实现生产者消费者问题 本实验报告的目的是通过编写Java程序实现生产者消费者问题,掌握进程同步和互斥的方法,学习使用信号量机制解决进程互斥问题。 一、实验原理 生产者消费者问题是操作系统中最基本的同步...
5. **死锁避免**: 在实现生产者-消费者问题时,必须注意死锁的可能。例如,如果生产者在放入元素前先等待消费者消费,而消费者在取出元素前又等待生产者生产,就可能出现死锁。合理设计同步机制和条件变量的使用可以...
在Java中,`java.util.concurrent`包下的`BlockingQueue`接口提供了一种线程安全的数据结构,非常适合用于实现生产者消费者模式。生产者将产品放入队列,消费者从队列中取出产品。`BlockingQueue`提供了`put()`和`...
这就是一个基本的Java“生产者-消费者”模型实现。通过这样的设计,我们可以有效地控制生产者和消费者的执行顺序,确保了数据的正确性,并且避免了先消费后生产的情况。在实际应用中,可能需要根据具体需求进行优化...
Java实现生产者消费者问题与读者写者问题详解 Java语言在多线程编程中提供了对同步机制的良好支持,解决生产者/消费者问题的方法可分为两类:(1)采用某种机制保护生产者和消费者之间的同步;(2)在生产者和消费...
在`JThreadSynch`这个压缩包文件中,我们可以预见到包含的Java源代码将展示以上的一种或多种机制,通过具体的示例代码来解释和实现生产者消费者问题的线程同步和互斥。通过学习和理解这个示例,开发者可以更好地掌握...
生产者与消费者问题在计算机科学中是一个经典的多线程同步问题,主要涉及到进程间的通信和资源的共享。在Java中,我们通常通过`wait()`、`notify()`和`notifyAll()`这三个方法,以及`synchronized`关键字来解决这个...
生产者消费者模式是一种经典的多线程同步问题解决方案,它源于现实世界中的生产流水线,用于描述生产者(Producer)和消费者(Consumer)之间的协作关系。在这个模式中,生产者负责生成产品并放入仓库,而消费者则从...
在CSDN.NET博客文章中,作者详细讨论了如何使用线程同步和等待的应用来解决此问题,并提供了示例代码ProducerConsumer.java和ProducerConsumerx.java,这些代码可以帮助读者更好地理解和实现生产者消费者模型。...
下面,我们将详细讨论如何使用Java实现生产者消费者问题: 1. **创建BlockingQueue**:首先,我们需要创建一个`BlockingQueue`实例,如`ArrayBlockingQueue`,设置其容量为缓冲区大小。 ```java BlockingQueue...
生产者消费者图 存储空间已满,而生产者占用着它,消费者等着生产者让出空间从而去除产品,生产者等着消费者消费产品,从而向空间中添加产品。互相等待,从而发生死锁。 JAVA解决线程模型的三种方式 1...
下面详细阐述如何使用Java实现生产者消费者问题: 1. **使用BlockingQueue**:创建一个固定大小的`BlockingQueue`作为共享缓冲区。例如,可以使用`ArrayBlockingQueue`,它是一个基于数组的阻塞队列。 ```java ...
例如,可以使用`ArrayBlockingQueue`来实现生产者消费者问题: ```java import java.util.concurrent.ArrayBlockingQueue; class Buffer { private final ArrayBlockingQueue<Integer> queue = new ...
下面是一个简单的Java实现生产者消费者问题的例子: 1. 首先,定义一个`BlockingQueue`实例作为缓冲区: ```java import java.util.concurrent.ArrayBlockingQueue; BlockingQueue<Integer> buffer = new ...
通过理解和掌握这些知识点,开发者能够有效地实现生产者-消费者模式,解决并发编程中的数据共享和协作问题。在实际项目中,这个模式常用于优化系统性能,尤其是在I/O密集型或计算密集型的应用中。
基本满足操作系统课上要求,java实现的生产者消费者模型。
设计目的:通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制。说明:有界缓冲区内设有20 个存储单元,放入/取出的数据项设定为1‐20 这20 个整型数。设计要求:1)每个生产者和消费者对有界缓冲区...
用java多线程,实现生产者消费者同步和互斥的问题,操作系统中的经典问题
操作系统中的生产者-消费者问题是多线程编程中的经典案例,主要用来展示线程同步和通信的概念。在这个Java实现中,我们将深入理解这个问题的背景、原理以及如何通过Java的并发工具来解决。 生产者-消费者问题的基本...