package ThreadDemo; import java.util.Date; /*生产者(Producer)将产品交给店员(check),而消费者(Customer)从店员出取走产品。 店员一次只能维持固有数量的产品(比如20)。如果生产者试图生产更多的产品,店员会叫生产者停一下。 如果店中有空位,店员会叫生产者生产。如果店中没有产品了,会告诉消费者等一下。如果店中有产品了 再通知消费者来取走。 * *分析1 *1:是否涉及到多线程的问题?是!生产者,消费者 *2:是否会涉及到共享数据?是 *3:此共享数据是谁?产品的数量 *4:是否涉及到线程的通信?存在生产者与消费者的通信。 *分析2 *1.有个店员类Clerk,负责检查当前产品数量,并应该有两个方法,增加产品,减少产品 *2:有个生产者Producer.Producer 是个线程,需要循环不断的 调用增加产品的方法。 *3:有个消费者Customer Producer 是个线程,需要循环不断的 调用减少产品的方法。 * */ class Clerk { // 店员 int product = 0; Date d = new Date(); public void addProduce() { synchronized (Clerk.class) { // 如果这个地方用的是类锁,后面的wait,就必须用Clerk.class.wait这种形式 // Obj.wait(),与Obj.notify()必须要与synchronized(Obj)一起使用, // 也就是wait,与notify是针对已经获取了Obj锁进行操作. // synchronized (this) { if (product >= 20) { try { Clerk.class.wait(); // wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else { product++; System.out.println(Thread.currentThread().getName() + ":" + product); } Clerk.class.notifyAll(); // notifyAll() } } public void reduceProduce() { synchronized (Clerk.class) { if (product <= 0) { try { Clerk.class.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else { System.out.println(Thread.currentThread().getName() + ":" + product); product--; } Clerk.class.notifyAll(); } } } class Producer implements Runnable {// 生产者 Clerk clerk; public Producer(Clerk clerk) { this.clerk = clerk; } public void run() { while (true) { clerk.addProduce(); // TODO Auto-generated method stub } } } class Customer implements Runnable {// 生产者 Clerk clerk; public Customer(Clerk clerk) { this.clerk = clerk; } public void run() { while (true) { clerk.reduceProduce(); } } } public class CopyOfTestProduceConsume { public static void main(String[] args) { Clerk clerk = new Clerk(); Producer producer = new Producer(clerk); Thread thread1 = new Thread(producer); thread1.setName("生产者"); Customer customer = new Customer(clerk); Thread thread2 = new Thread(customer); thread2.setName("消费者"); thread1.start(); thread2.start(); } }
相关推荐
bcb_多线程示例,学习笔记 MutilThread(生产者与消费者) 线程协调工作示例
java多线程学习,生产者消费者问题示例
本资源是基于mfc的生产者消费者的多线程学习资源,对初学mfc的人来说很有用
在生产者---消费者问题中应注意(信号量名称以多个生产者和多个消费者中的为例):首先,在每个程序中用于互斥的wait(mutex)和signal(mutex)必须成对出现;其次,对资源信号量empty和full的wait和signal操作,同样...
(1)掌握基本的同步互斥算法,理解生产者和消费者同步的问题模型。 (2)了解Windows 2000/XP中多线程的并发执行机制,线程间的同步和互斥。 (3)学习使用Windows2000/XP中基本的同步对象,掌握相应的API。 2、...
在本文件中,可以逐步学习生产者与消费者问题的案例,并了解java多线程中的诸多问题
C#多线程学习(三) 生产者和消费者 While争夺发生,lock语句 Monitor 类锁定一个对象 C#多线程学习(四) 多线程的自动管理(线程池) ThreadPool 的用法 ManualResetEvent对象有几个重要的方法 C#多线程学习(五) 多线程...
主要介绍了Java多线程生产者消费者模式实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
C#多线程学习(三) 生产者和消费者 5 While争夺发生,lock语句 5 Monitor 类锁定一个对象 8 C#多线程学习(四) 多线程的自动管理(线程池) 12 ThreadPool 的用法 13 ManualResetEvent对象有几个重要的方法 13 C#多线程...
1.生产者消费者对缓冲区进行互斥操作。 2.缓冲区大小为10,缓冲区满则不允许生产者生产数据,缓冲区空则不允许消费者消费数据。 3.生产者消费者各循环操作50次。 四、设计思路和采取的方案 1.利用windows提供的API...
(2)了解Windows 2000/XP中多线程的并发执行机制,线程间的同步和互斥。 (3)学习使用Windows2000/XP中基本的同步对象,掌握相应的API。 2、实验要求 (1)创建生产者和消费者线程 (2)生产和消费的规则 (3)...
本文实例讲述了C#多线程学习之生产者和消费者用法。分享给大家供大家参考。具体实分析如下: 前面的文章说过,每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数。这可能带来的问题就是...
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
生产者-消费者实例可以很好帮助初学java的同学们理解和学习多线程的知识
主要介绍了Java多线程 生产者消费者模型实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
采用python3完成的生产者消费者问题,涉及到多线程、多线程队列,有需要的小伙伴们可以看看哎~ 欢迎交流学习~
1、通过编写程序,掌握基本的同步互斥算法,理解生产者和消费者模型。 2、了解多线程并发执行机制,线程间的同步和互斥。 3、学习使用同步对象,掌握相应的函数。