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();
}
}