资源同步与互斥问题(生产者与消费者)
2014-11-05 20:15
176 查看
源码:
package hsx.test;
public class Sample {
public static void main(String[] args) {
BreadContainer bc = new BreadContainer(50);
Producer producer1 = new Producer(bc, 50, "producer1");
Producer producer2 = new Producer(bc, 200, "producer2");
Consumer consumer1 = new Consumer(bc, 290, "consumer1");
Consumer consumer2 = new Consumer(bc, 70, "consumer2");
Consumer consumer3 = new Consumer(bc, 80, "consumer3");
consumer1.start();
consumer2.start();
producer1.start();
producer2.start();
consumer3.start();
}
}
class BreadContainer {
public static final int MAXNUM = 300;
private int num = 0;
public BreadContainer(int num) {
this.num = num;
}
public synchronized void produceBread(String produceName, int produceNum) {
while(num + produceNum > MAXNUM) {
System.out.println("要生产的量加上原有的量超过了容器的量,所以" + produceName + "等待消费者消费部分,满足再生产。");
try {
wait();
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
num += produceNum;
System.out.println(produceName + "生产了" + produceNum + "个,现在一共有" + num + "个。");
notifyAll();
}
public synchronized void consumeBread(String consumeName, int consumeNum) {
while(consumeNum > num) {
System.out.println("要消费的量超过了容器的总量,所以" + consumeName + "等待生产者生产部分,满足再消费。");
try {
wait();
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
num -= consumeNum;
System.out.println(consumeName + "消费了" + consumeNum + "个,现在一共有" + num + "个。");
notifyAll();
}
}
class Producer extends Thread {
private BreadContainer bc = null;
private int produceNum = 0;
public Producer(BreadContainer bc, int produceNum, String ProduceName) {
this.bc = bc;
this.produceNum = produceNum;
this.setName(ProduceName);
}
@Override
public void run() {
bc.produceBread(this.getName(), produceNum);
}
}
class Consumer extends Thread {
private BreadContainer bc = null;
private int consumeNum = 0;
public Consumer(BreadContainer bc, int consumeNum, String consumeName) {
this.bc = bc;
this.consumeNum = consumeNum;
this.setName(consumeName);
}
@Override
public void run() {
bc.consumeBread(this.getName(), consumeNum);
}
}
显示结果:
要消费的量超过了容器的总量,所以consumer1等待生产者生产部分,满足再消费。
要消费的量超过了容器的总量,所以consumer2等待生产者生产部分,满足再消费。
producer1生产了50个,现在一共有100个。
consumer2消费了70个,现在一共有30个。
要消费的量超过了容器的总量,所以consumer1等待生产者生产部分,满足再消费。
producer2生产了200个,现在一共有230个。
要消费的量超过了容器的总量,所以consumer1等待生产者生产部分,满足再消费。
consumer3消费了80个,现在一共有150个。
要消费的量超过了容器的总量,所以consumer1等待生产者生产部分,满足再消费。
源码:
package hsx.test;
public class Sample {
public static void main(String[] args) {
BreadContainer bc = new BreadContainer(50);
Producer producer1 = new Producer(bc, 50, "producer1");
Producer producer2 = new Producer(bc, 200, "producer2");
Consumer consumer1 = new Consumer(bc, 290, "consumer1");
Consumer consumer2 = new Consumer(bc, 70, "consumer2");
Consumer consumer3 = new Consumer(bc, 80, "consumer3");
consumer1.start();
consumer2.start();
producer1.start();
producer2.start();
consumer3.start();
}
}
class BreadContainer {
public static final int MAXNUM = 300;
private int num = 0;
public BreadContainer(int num) {
this.num = num;
}
public synchronized void produceBread(String produceName, int produceNum) {
while(num + produceNum > MAXNUM) {
System.out.println("要生产的量加上原有的量超过了容器的量,所以" + produceName + "等待消费者消费部分,满足再生产。");
try {
wait();
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
num += produceNum;
System.out.println(produceName + "生产了" + produceNum + "个,现在一共有" + num + "个。");
notifyAll();
}
public synchronized void consumeBread(String consumeName, int consumeNum) {
while(consumeNum > num) {
System.out.println("要消费的量超过了容器的总量,所以" + consumeName + "等待生产者生产部分,满足再消费。");
try {
wait();
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
num -= consumeNum;
System.out.println(consumeName + "消费了" + consumeNum + "个,现在一共有" + num + "个。");
notifyAll();
}
}
class Producer extends Thread {
private BreadContainer bc = null;
private int produceNum = 0;
public Producer(BreadContainer bc, int produceNum, String ProduceName) {
this.bc = bc;
this.produceNum = produceNum;
this.setName(ProduceName);
}
@Override
public void run() {
bc.produceBread(this.getName(), produceNum);
}
}
class Consumer extends Thread {
private BreadContainer bc = null;
private int consumeNum = 0;
public Consumer(BreadContainer bc, int consumeNum, String consumeName) {
this.bc = bc;
this.consumeNum = consumeNum;
this.setName(consumeName);
}
@Override
public void run() {
bc.consumeBread(this.getName(), consumeNum);
}
}
显示结果:
要消费的量超过了容器的总量,所以consumer1等待生产者生产部分,满足再消费。
要消费的量超过了容器的总量,所以consumer2等待生产者生产部分,满足再消费。
producer1生产了50个,现在一共有100个。
consumer2消费了70个,现在一共有30个。
要消费的量超过了容器的总量,所以consumer1等待生产者生产部分,满足再消费。
producer2生产了200个,现在一共有230个。
要消费的量超过了容器的总量,所以consumer1等待生产者生产部分,满足再消费。
consumer3消费了80个,现在一共有150个。
要消费的量超过了容器的总量,所以consumer1等待生产者生产部分,满足再消费。
相关文章推荐
- 进程间同步互斥经典问题(一)生产者-消费者问题
- 利用线程的同步和互斥解决两个消费者两个生产者一个临界区问题
- linux中的生产者和消费者问题--信号量 互斥 同步
- Linux下信号量实现进程同步、互斥(生产者消费者问题)
- python 生产者,消费者的同步互斥问题
- Linux下生产者消费者问题详细分析(操作系统期中考试论文---并发程序的同步和互斥)
- 同步互斥问题(生产者消费者模型)
- 进程、线程知识点总结和同步(消费者生产者,读者写者三类问题)、互斥、异步、并发、并行、死锁、活锁的总结
- 进程间同步互斥经典问题(一)生产者-消费者问题
- 生产者-消费者问题实现 (linux下C同步信号量和互斥信号量的应用)
- 经典生产者与消费者问题(线程的同步与互斥)
- 三个同步与互斥问题之生产者与消费者
- 操作系统经典同步互斥问题——生产者消费者问题
- 进程、线程知识点总结和同步(消费者生产者,读者写者三类问题)、互斥、异步、并发、并行、死锁、活锁的总结
- 进程同步互斥经典题之消费者与生产者问题
- 关于网宿厦门研发中心笔试的一道PV操作题:利用java中的多线程实现生产者与消费者的同步问题
- 经典进程同步问题 生产者——消费者问题
- JAVA多线程经典问题 -- 生产者 消费者 同步队列实现方法
- [原创]C#编写的多生产者多消费者同步问题
- C# 生产者和消费者问题使用Monitor同步