Java—多线程5—生产者和消费者模型
单生产者,单消费者
class Goods {
private int count;
private String goodName;
/**
* 生产商品
*/
public synchronized void producer(String goodName) throws InterruptedException {
if(count>0){
wait();
}
this.goodName=goodName;
count=count+1;
System.out.println(toString());
notify();
}
/**
* 消费商品
*/
public synchronized void consumer(String goodName) throws InterruptedException {
if(count==0){
wait();
}
this.goodName=goodName;
count=count-1;
System.out.println(toString());
notify();
}
@Override
public String toString() {
return "Goods{" +
"count=" + count +
", goodName='" + goodName + '\'' +
'}';
}
}
class Produce implements Runnable{
private Goods goods;
public Produce(Goods goods) {
this.goods = goods;
}
@Override
public void run() {
try {
this.goods.producer("生产纪梵希");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class Consumer implements Runnable{
private Goods goods;
public Consumer(Goods goods) {
this.goods = goods;
}
@Override
public void run() {
try {
this.goods.consumer("消费纪梵希");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class Test{
public static void main(String[] args) {
Goods goods=new Goods();
new Thread(new Consumer(goods)).start();
new Thread(new Produce(goods)).start();
}
}
多生产者 多消费者
class Goods {
private int count;
private String goodName;
/**
* 生产商品
*/
public synchronized void producer(String goodName) throws InterruptedException {
while(count>0){
wait();
}
this.goodName=goodName;
count=count+1;
System.out.println(toString());
notifyAll();
}
/**
* 消费商品
*/
public synchronized void consumer(String goodName) throws InterruptedException {
while(count==0){
System.out.println("商品买完了");
wait();
}
this.goodName=goodName;
count=count-1;
System.out.println(toString());
notifyAll();
}
@Override
public String toString() {
return "Goods{" +
"count=" + count +
", goodName='" + goodName + '\'' +
'}';
}
}
class Produce implements Runnable{
private Goods goods;
public Produce(Goods goods) {
this.goods = goods;
}
@Override
public void run() {
try {
while(true) {
this.goods.producer("生产纪梵希");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class Consumer implements Runnable{
private Goods goods;
public Consumer(Goods goods) {
this.goods = goods;
}
@Override
public void run() {
try {
while(true) {
this.goods.consumer("消费纪梵希");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public class Test{
public static void main(String[] args) {
Goods goods=new Goods();
new Thread(new Consumer(goods)).start();
new Thread(new Produce(goods)).start();
}
}