java线程 买东西例子_java Thread 多线程 经典仓储--生产--消费实例

这两天,要做个东西,用到多线程,温习一下,写了一个经典多线程例题,仓储--生产--消费的例子,希望能对大家有点帮助.

实现原理:我们去建立一个仓库(Storage),仓库中有个入库最大值,当达到这个最大值的时候,生产(Product)就停止生产.消费者就会去消费,消费之前会查询仓库里的存货量,当存货量等于0的时候,就让其停止消费,这时候,开始生产,就这样的一个循环过程.

注意:这都是继承

Thread进行多线程,没有采用实现Runnable这个接口

下面给出一个完整的实现代码:

Storage(仓储类)

package com.common.thread.product;

public class Storage {

private static final int

max_num=100;//最大库存量 private int

cruNum;//当前库存量 public Storage()

{

super();

}

public Storage(int cruNum) {

super();

this.cruNum = cruNum;

}

public synchronized void product(int

needNum){

//是否需要生产 while(needNum+cruNum>max_num){

System.out.println("需要生产的数量:"+needNum+"超过剩余库存量"+(max_num-cruNum)+",暂时不能执行生产任务!");

try {

//当前的生产线程等待 wait();

} catch

(InterruptedException e) {

e.printStackTrace();

}

}

//满足生产条件,进行生产,更改库存量 cruNum+=needNum;

System.out.println("已经生产了:"+needNum+"个产品,现在仓储量:"+cruNum);

//呼唤在此线程上监视上所有等待的线程 notifyAll();

}

public synchronized void Consum(int

needNum){

//测试是否可以消费 while(cruNum

try {

//等待生产

wait();

} catch

(InterruptedException e) {

e.printStackTrace();

} }

//满足消费条件则进行消费 cruNum-=needNum;

System.out.println("已经消费了:"+needNum+"个,还剩余:"+cruNum);

//唤醒等待线程 notifyAll();

}

}

//===========================产品类(Product)==========================

package com.common.thread.product;

public class Product extends Thread{

private int prodNum;//生产数量 private Storage

storage;//仓库 public Product(int

prodNum, Storage storage) {

super();

this.prodNum = prodNum;

this.storage = storage;

}

public void run(){

storage.product(prodNum);

}

}

//==================消费类(Consum

)==============================

public class Consum extends Thread {

private int conNum;//消费数量 private Storage

storage;//仓库 public Consum(int

conNum, Storage storage) {

super();

this.conNum = conNum;

this.storage = storage;

}

public int getConNum() {

return conNum;

}

public void setConNum(int conNum) {

this.conNum = conNum;

}

public Storage getStorage() {

return storage;

}

public void setStorage(Storage storage) {

this.storage = storage;

}

public void run(){

storage.Consum(conNum);

}

}

//=========================测试类(Test)================================

package com.common.thread.product;

public class Test {

public static void main(String[] args) {

Storage storage=new

Storage(5);

Consum c1=new Consum(10,

storage);

Consum c2=new Consum(20,

storage);

Consum c3=new Consum(25,

storage);

Consum c4=new Consum(13,

storage);

Product p1=new Product(10,

storage);

Product p2=new Product(20,

storage);

Product p3=new Product(30,

storage);

Product p4=new Product(40,

storage);

System.out.println("********************************");

c1.start();

c2.start();

c3.start();

c4.start();

p1.start();

p2.start();

p3.start();

p4.start();

}

}

//===============运行结果==================================

********************************

已经生产了:20个产品,现在仓储量:25

已经生产了:10个产品,现在仓储量:35

已经消费了:13个,还剩余:22

已经消费了:20个,还剩余:2

已经生产了:30个产品,现在仓储量:32

已经生产了:40个产品,现在仓储量:72

已经消费了:10个,还剩余:62

已经消费了:25个,还剩余:37

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值