public class ComsumerAndProducer {
public static void main(String[] args) {
LanZhi lz = new LanZhi();
// 用同一个篮子初始化生产者和消费者,使生产者和消费者竞争同一个对象锁
Comsumer comsumer = new Comsumer(lz);
Producer producer = new Producer(lz);
// 同一个comsumer起三个线程,一共可以消费60个馒头
new Thread(comsumer, "comsumer1").start();
new Thread(comsumer, "comsumer2").start();
new Thread(comsumer, "comsumer3").start();
// 一个生产者可以生产60个馒头
new Thread(producer, "producer").start();
}
}
class ManTou {
private int id; // 馒头的id
public ManTou(int id) {
this.id = id;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
class LanZhi {
ManTou[] manTous = new ManTou[6];
int index = 0;
public synchronized void put(ManTou mt) {
// 注意这里一定是while,否则不会连续阻塞
while (index == manTous.length) {
try {
System.out.println("put wait:"
+ Thread.currentThread().getName());
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
manTous[index] = mt;
System.out.println(Thread.currentThread().getName() + " put a man tou "
+ mt.getId());
index++;
notify();
}
public synchronized ManTou get() {
while (index == 0) {
try {
System.out.println("get wait: "
+ Thread.currentThread().getName());
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
index--;
ManTou mt = manTous[index];
System.out.println(Thread.currentThread().getName() + " get a man tou "
+ mt.getId());
notify();
return mt;
}
}
class Comsumer implements Runnable {
LanZhi lz = null;
@Override
public void run() {
for (int i = 0; i < 20; i++) {
lz.get();
try {
// 取一个馒头后,休息个随机事件
Thread.sleep((int) (Math.random() * 1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public Comsumer(LanZhi lz) {
this.lz = lz;
}
}
class Producer implements Runnable {
LanZhi lz = null;
@Override
public void run() {
for (int i = 0; i < 60; i++) {
ManTou mt = new ManTou(i);
lz.put(mt);
try {
// 放一个馒头后休息随机时间
Thread.sleep((int) Math.random() * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public Producer(LanZhi lz) {
this.lz = lz;
}
}
生产者和消费者问题
最新推荐文章于 2020-12-03 17:02:24 发布