代码-JavaSE-多线程-多生产者多消费者示例

package ceshi.duoxiancheng.kaoya;

/**
* 一个烤鸭程序
* 2个生产者,2个消费者
* 使用的同步方法是synchronized
*
* 写的时候遇到了2个问题:
* 1notify()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();
}
}
posted @ 2018-08-07 23:24  wonewo  阅读(223)  评论(0编辑  收藏  举报