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(); } }
生产者与消费者,学习多线程
猜你喜欢
转载自programmer-q.iteye.com/blog/2256304
今日推荐
周排行