public class ProducerAndConsumer { public static void main(String[] args) { Storage storage = new Storage(); Thread producer1 = new Thread(new Producer(storage, "producer1")); Thread producer2 = new Thread(new Producer(storage, "producer2")); Thread producer3 = new Thread(new Producer(storage, "producer3")); Thread consumer1 = new Thread(new Consumer(storage, "Consumer1")); Thread consumer2 = new Thread(new Consumer(storage, "Consumer2")); producer1.start(); producer2.start(); producer3.start(); consumer1.start(); consumer2.start(); } } //仓库 class Storage { private int index = 0; private Product[] products = new Product[20]; public int getSize() { return this.index; } // 生产者往仓库中放入产品 public synchronized void push(Product product) { while (index == products.length) { try { //仓库已满,等待 wait(); } catch (InterruptedException ex) { ex.printStackTrace(); } } //把产品放入仓库 products[index++] = product; System.out.println(product.getProducer() + " 存入了产品 " + product + " ,仓库共有 " + this.index + "个产品!"); //唤醒等待线程 notifyAll(); } // 消费者从仓库中取出产品 public synchronized Product pop(String consumer) { while (index == 0) { try { wait();//仓库空,等待 } catch (InterruptedException ex) { ex.printStackTrace(); } } //从仓库中取产品 Product product = products[--index]; products[index] = null; System.out.println(consumer + " 消费了产品 " + product + " ,仓库共有 " + this.index + "个产品!"); //唤醒等待线程 notifyAll(); return product; } } //产品类 class Product { private long id;// 产品id private String producer;// 生产者 public Product(long id, String producer) { this.id = id; this.producer = producer; System.out.println(this.producer + "生产了产品:" + this.id); } public long getId() { return this.id; } public String getProducer() { return this.producer; } @Override public String toString() { return "(产品ID:" + this.id + " 生产者:" + this.producer + ")"; } } //生产者 class Producer extends Thread { private Storage storage; public Producer(Storage storage, String name) { super(name); this.storage = storage; } @Override public void run() { while (true) { storage.push(new Product(new java.util.Date().getTime(), super.getName())); try { Thread.sleep(100); } catch (InterruptedException ex) { ex.printStackTrace(); } } } } //消费者 class Consumer extends Thread { private Storage storage; public Consumer(Storage storage, String name) { super(name); this.storage = storage; } @Override public void run() { while (true) { storage.pop(super.getName()); try { Thread.sleep(100); } catch (InterruptedException ex) { ex.printStackTrace(); } } } }
* 多线程同步 synchronized方法和代码块:每个对象都有一个锁,当线程进入对象的synchronized方法或
代码块时,该线程获得对象的锁,其他线程在访问该对象的任何synchronized方法或代码块时无法获得
锁被挂起等待。对象的其他非synchronized方法不受锁的影响。
* static synchronized方法的锁对象是ClassName.class。
相关推荐
本代码是用JAVA实现的生产者与消费者的问题,线程间的同步与互斥功能
Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上) Java线程:新特征-锁(下) ...
Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上) Java线程:新特征-锁(下) Java...
设计要求:1)每个生产者和消费者对有界缓冲区进行操作后,实时显示有界缓冲区的全部内容、当前指针位置和生产者/消费者的标识符。2)生产者和消费者各有两个以上。3)多个生产者或多个消费者之间须有共享的对缓冲区...
主要介绍了Java多线程生产者消费者模式实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
用java为源代码,解决多线程编程中的经典问题:生产者消费者问题
在生产者---消费者问题中应注意(信号量名称以多个生产者和多个消费者中的为例):首先,在每个程序中用于互斥的wait(mutex)和signal(mutex)必须成对出现;其次,对资源信号量empty和full的wait和signal操作,同样...
重命名 实验三多:线程同步与协作:生产者与消费者 为 实验三:多线程同步与协作:生产者与消费者 实验九:使用jdbc存取大文本 add 实验九:使用jdbc存取大文本. 实验二:多线程打字游戏 add 实验二:多线程...
javathread.zip 10.Java多线程编程(线程池、生产者消费者、存取款实例) javautil.zip 11.Java常用实体类 javaxml.zip 14.XML属性文件 第4部分(6个程序包) javagui.zip 15.Java GUI库对比实例 javaawt.zip ...
本资源为您提供了关于 Java 并发编程理论基础的精讲,涵盖了多线程编程的核心概念、基本原理以及在 Java 中的应用。通过深入学习,您将建立坚实的并发编程基础,能够更好地理解和应对多线程编程中的挑战。 并发编程...
本例将模仿经典的线程同步互斥例子——生产者和消费者问题,来演示 java 强大的多线程机制。生产者和消费者共享一个数据,当数据为0 时,消费者不可访问,生产者可访问数据,每次访问数据加1;当数据到达100 时,...
javathread.zip 10.Java多线程编程(线程池、生产者消费者、存取款实例) javautil.zip 11.Java常用实体类 javaxml.zip 14.XML属性文件 第4部分(6个程序包) javagui.zip 15.Java GUI库对比实例 javaawt.zip 16....
生产者消费者问题是典型的多线程编程例子,这个程序也是多线程编程必须经历的程序。希望对大家有说帮助。
5.3 阻塞队列和生产者-消费者模式 5.3.1 示例:桌面搜索 5.3.2 串行线程封闭 5.3.3 双端队列与工作密取 5.4 阻塞方法与中断方法 5.5 同步工具类 5.5.1 闭锁 5.5.2 FutureTask 5.5.3 信号量 5.5.4 栅栏 5.6...
2. 进一步熟悉掌握Java程序设计语言的基础内容,如用户图形界面设计、Java多线程编程、Applet程序的设计、文件和网络输入输出流编程、Java数据库编程等。 3. 通过亲自动手写程序,一方面拓展知识面,一方面...
Java并发编程学习宝典(漫画版),Java并发编程学习宝典(漫画版)Java并发编程学习宝典(漫画版)Java并发编程学习宝典(漫画版)Java并发编程学习宝典(漫画版)Java并发编程学习宝典(漫画版)Java并发编程学习...
9.5 优化消息目的地destination及消息生产者与消费者 9.6 优化消息对象及合理使用事务机制 9.7 影响jms性能的其他因素 小结 …… 第12章 java多线程技术与应用性能优化 12.1 java多线程技术 12.1.1 进程与线程 ...