关于多线程的生产者消费者模式

生产者消费者模式是针对现实情况开发出来的,模拟了多线程的同步机制,

需求:两个线程需要对同一对象进行不同的操作,并且这个过程需要两个线程同时进行

下面我们用蛋糕店举个例子:有一家蛋糕店卖蛋糕,有消费者和生产商两个对象,

消费者负责买蛋糕店的蛋糕,生产商向蛋糕店供应

蛋糕,消费和生产是同时进行的,不能出现供大于求,

或者供不应求的现象。

该模式中用到wait和notify方法:

wait和notify方法不是线程对象的方法,是java中任何一个java对象

都有的方法,因为这两个方式是Object类中自带的。

wait方法和notify方法不是通过线程对象调用,

不是这样的:t.wait(),也不是这样的:t.notify()..不对。

当蛋糕店蛋糕数量囤积达到一定数量时,生产者应停止生产,消费者要消费

当蛋糕店卖完了蛋糕或者卖到蛋糕数量所剩不多时,停止消费(我不卖 了!!!),开始生产。

下面是代码:

import java.sql.Array;

import java.util.ArrayList;

import java.util.List;

public class test {

public static void main(String[] args) {

List cakeShop=new ArrayList();

Producer producer=new Producer(cakeShop);

Consumer consumer=new Consumer(cakeShop);

Thread tp=new Thread(producer,"生产商");

Thread tc=new Thread(consumer,"消费者");

tc.setPriority(1);

tp.setPriority(10);

tp.start();

tc.start();

}

}

//生产者

class Producer implements Runnable{

private List cakeShop;

public List getCakeShop() {

return cakeShop;

}

public void setCakeShop(List cakeShop) {

this.cakeShop = cakeShop;

}

//构造方法,拿到蛋糕店对象

public Producer(List cakeShop) {

this.cakeShop = cakeShop;

}

@Override

public void run() {

//生产者一直生产

while (true){

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

//蛋糕店蛋糕数量>=10个,停止生产,进入等待

synchronized (this.getCakeShop()){

if (cakeShop.size()>=10){

try {

cakeShop.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

//程序到这说明蛋糕数量<10,需要生产

cakeShop.add(new Cake());//生产一个蛋糕

System.out.println(Thread.currentThread().getName()+"生产蛋糕,还有----->"+cakeShop.size()+"个蛋糕");

cakeShop.notifyAll();//释放蛋糕店对象锁,好让消费者去消费

}

}

}

}

//消费者

class Consumer implements Runnable{

private List cakeShop;

public List getCakeShop() {

return cakeShop;

}

public void setCakeShop(List cakeShop) {

this.cakeShop = cakeShop;

}

//构造方法,拿到蛋糕店对象

public Consumer(List cakeShop) {

this.cakeShop = cakeShop;

}

@Override

public void run() {

//消费也一直在进行

while (true){

int i=0;

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

synchronized (this.getCakeShop()){

//蛋糕卖完了,停止消费

if (cakeShop.size()==0){

try {

cakeShop.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

//程序执行到这说明还有蛋糕,需要卖掉

cakeShop.remove(i);//卖掉下标为0处的蛋糕

i++;

System.out.println(Thread.currentThread().getName()+"买蛋糕,还有----->"+cakeShop.size()+"个蛋糕");

//卖掉蛋糕后要唤醒,释放蛋糕店对象锁

cakeShop.notifyAll();

}

}

}

}

//蛋糕类

class Cake {

String name;

double price;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值