这两天,要做个东西,用到多线程,温习一下,写了一个经典多线程例题,仓储--生产--消费的例子,希望能对大家有点帮助.
实现原理:我们去建立一个仓库(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