package ceshi.duoxiancheng.kaoya;
/**
* 一个烤鸭程序
* 2个生产者,2个消费者
* 使用的同步方法是synchronized
*
* 写的时候遇到了2个问题:
* 1:notify()、notifyall()、wait()的调用者,必须和同步的锁是一致的!
* 2:需要while(true)来保证方法能够多次执行!
*/
class KaoYa {
}
class KaoYaXiangZi {
final KaoYa[] items = new KaoYa[100];
int putptr,takeptr,count;
public void put(KaoYa x) {
synchronized (this) {
while (count == 100) {
try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); }
}
items[putptr]=x;
System.out.println("put KaoYa" + (++putptr));
count++;
if (putptr == 100) {
putptr=0;
}
this.notifyAll();
}
}
public void take() {
synchronized (this) {
while (count == 0) {
try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); }
}
KaoYa x = items[takeptr];
System.out.println("take KaoYa"+"..."+(++takeptr));
count--;
if (takeptr == 100) {
takeptr=0;
}
this.notifyAll();//锁要和调用此方法的对象是同一个
}
}
}
class PutKaoYa implements Runnable{
private KaoYaXiangZi kaoyaxiangzi;
public PutKaoYa(){}
public PutKaoYa(KaoYaXiangZi kaoyaxiangzi) {
this.kaoyaxiangzi=kaoyaxiangzi;
}
public void run() {
while(true)//必须设置循环,保证可多次执行
kaoyaxiangzi.put(new KaoYa());
}
}
class TakeKaoYa implements Runnable{
private KaoYaXiangZi kaoyaxiangzi;
public TakeKaoYa(){}
public TakeKaoYa(KaoYaXiangZi kaoyaxiangzi) {
this.kaoyaxiangzi=kaoyaxiangzi;
}
public void run() {
while(true)
kaoyaxiangzi.take();
}
}
public class SynchronizedDemo {
public static void main(String[] args) {
KaoYaXiangZi xiangZi=new KaoYaXiangZi();
PutKaoYa put1 = new PutKaoYa(xiangZi);
PutKaoYa put2 = new PutKaoYa(xiangZi);
TakeKaoYa take1 = new TakeKaoYa(xiangZi);
TakeKaoYa take2 = new TakeKaoYa(xiangZi);
Thread t0 = new Thread(put1);
Thread t1 = new Thread(put2);
Thread t2 = new Thread(take1);
Thread t3 = new Thread(take2);
t0.start();
t1.start();
t2.start();
t3.start();
}
}