package com.rule;
public class TesProducerAndConsumer {
public static void main(String[] args) {
Clerk clerk=new Clerk();
Producer producer=new Producer(clerk);
Consumer consumer=new Consumer(clerk);
new Thread(producer,"生产者A1").start();
new Thread(consumer,"消费者B1").start();
}
}
class Clerk{//店员类
private static final int TOTAL=1;//数字取1是为了放大问题
private int num=0;
public synchronized void get() {//店员买货
if(num>=TOTAL) {
System.out.println("库存已满,无法进货");
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else {
System.out.println(Thread.currentThread().getName()+" : "+ (num++));
this.notifyAll();
}
}
public synchronized void sale() {//店员卖货
if(num<=0) {
System.out.println("库存已空,无法卖货");
try {
this.wait();
System.err.println("num="+num+" wait被唤醒后直接从this.wait();后面的语句继续执行,不是重新执行本方法");
} catch (InterruptedException e) {
e.printStackTrace();
}
}else {
System.out.println(Thread.currentThread().getName()+" : "+(num--));
this.notifyAll();
}
}
}
class Producer implements Runnable{
private Clerk clerk;
public Producer(Clerk clerk) {
this.clerk=clerk;
}
@Override
public void run() {
for (int i = 0; i<20; i++) {
try {
Thread.sleep(200);//放大问题
} catch (InterruptedException e) {
e.printStackTrace();
}
clerk.get();
}
}
}
class Consumer implements Runnable{
private Clerk clerk;
public Consumer(Clerk clerk) {
this.clerk=clerk;
}
@Override
public void run() {
for (int i = 0; i<20; i++) {
clerk.sale();
}
}
}