java 生产者消费者 demo_生产者与消费者--demo1---bai

import java.util.ArrayList;

import java.util.List;

import java.util.Random;

//自定义类,描述仓库

public class StoreHouse

{

private List products = new ArrayList(); //仓库的所有商品的列表

public void add(String product)

{

this.products.add(product);

}

Random rd = new Random();

public String sale() //随机从所有商品中,任取一件进行出售

{

int index = rd.nextInt(this.products.size());

//从数组中,删除序号为index的商品。并作为返回值返回。

String product = this.products.remove(index);

return product;

}

//获取仓库的商品个数

public int getSize()

{

return this.products.size();

}

}

import java.util.Random;

//消费者线程。不断的消费

public class ConsumeThread extends Thread

{

private StoreHouse house;//持有1个仓库

//构造函数中,传入仓库对象

public ConsumeThread(StoreHouse house)

{

this.house = house;

}

@Override

public void run() {

Random rd = new Random();

while(true)

{

synchronized (house)

{

if(house.getSize()==0)

{

System.out.println("仓库为空,消费者开始等待...");

//如果仓库为空,则本消费者线程进入等待状态。会释放同步锁。

try {

house.wait(); //释放同步锁,其他线程可以继续执行。

//Thread.sleep(3000);//不释放同步锁。所以其他线程无法继续执行。

//house.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

synchronized (house)

{

if (house.getSize() > 0) //只要仓库的库存大于0

{

String product = house.sale();

System.out.println("消费者从仓库中取走了 " + product);

}

}

try {

Thread.sleep(rd.nextInt(2000));

} catch (InterruptedException e) {

e.printStackTrace();

} //随机休息2秒以内的时间

}

}

}

import java.util.Random;

//生产者线程。不断的往仓库添加商品

public class ProduceThread extends Thread

{

private StoreHouse house;//持有1个仓库

//构造函数中,传入仓库对象

public ProduceThread(StoreHouse house)

{

this.house = house;

}

@Override

public void run()

{

Random rd = new Random();

//不断的往仓库添加商品

while(true)

{

synchronized (house)

{

//随机产生1个商品名

String product = "商品" + rd.nextInt(200);

//将该商品添加到仓库

house.add(product);

house.notifyAll();//通知所有其他处于wait状态的线程继续执行

System.out.println("生产者将 " + product + " 添加到仓库中");

}

try {

Thread.sleep(rd.nextInt(2000));

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} //随机休息2秒以内的时间

}

}

}

public class Test

{

public static void main(String[] args)

{

//1 创建1个仓库对象,作为共享数据

StoreHouse house = new StoreHouse();

//2 创建生产者线程

ProduceThread pt = new ProduceThread(house);

//3 创建消费者线程

ConsumeThread ct1 = new ConsumeThread(house);

ConsumeThread ct2 = new ConsumeThread(house);

//4 启动线程

pt.start();

ct1.start();

ct2.start();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值