java模拟阻塞队列的实现

来源:互联网 发布:club域名 网站 编辑:程序博客网 时间:2024/05/21 23:34

为了更好的理解java多线程机制,模拟java多线程阻塞队列实现。希望对你有用


package com.wxt.func.pv.noblokclist;
/**
 * 驱动程序
 * @author dragon
 *
 */
public class App {


public static void main(String[] args) {
BreadShop shop = new BreadShop(2);
BreadFactory factory = new BreadFactory(shop);
Customer c = new Customer("消费者1",shop);
Customer c1 = new Customer("消费者2",shop);
Customer c2 = new Customer("消费者3",shop);
Customer c3 = new Customer("消费者4",shop);
factory.create();
c.buyBread();
c1.buyBread();
c2.buyBread();
c3.buyBread();


}
}


package com.wxt.func.pv.noblokclist;


/**
 * 面包模型
 * @author coffee
 *
 */
public class Bread {


private String name;

private String color;

private String memo;


public Bread(String name, String color) {
this(name,color,"");
};
public Bread(String name, String color, String memo) {
this.name = name;
this.color = color;
this.memo = memo;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getMemo() {
return memo;
}
public void setMemo(String memo) {
this.memo = memo;
};

public String toString(){
return "{name:"+this.name+",color:"+this.color+",memo:"+this.memo+"}";
}




}


package com.wxt.func.pv.noblokclist;


import org.apache.log4j.Logger;


/**
 * 面包加工厂
 * @author coffee
 *
 */
public class BreadFactory extends Thread{



private BreadShop breadShop;

String[] colors = new String[]{"黑死","红色","白色"};

public BreadFactory(BreadShop breadShop){
this.breadShop = breadShop;
this.setName("面包制造工厂");
}

public synchronized void create(){
this.start();

}

/**
* 不断的生产面包
*/
public void run(){
Bread bread = null;
int index = 1;
String color = "";
while(true){
color = colors[index%3];
bread = new Bread(index+"号面包",color);
System.out.println("【"+Thread.currentThread().getName()+"】开始生产:"+"["+bread.getName()+","+bread.getColor()+"]");
try {
if(index>=this.breadShop.getSize()){
//wait();
}
this.breadShop.storeBread(bread);
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
index++;
}
}


}


package com.wxt.func.pv.noblokclist;


import java.util.ArrayList;
import java.util.List;


import org.apache.log4j.Logger;


/**
 * 面包直销店(卖面包的商店)
 * @author dragon
 *
 */
public class BreadShop{

private List<Bread> breads;

private int size;

public BreadShop(int size){
breads = new ArrayList<Bread>(size);
this.size = size;
}

/**
* 从面包加工厂购入面包
* @param bread
* @throws InterruptedException
*/
public synchronized void storeBread(Bread bread) throws InterruptedException{
if(this.breads.size() == this.size){
wait();
}
if(this.breads.size() == 0){
notifyAll();
}

this.breads.add(bread);
System.out.println("【面包零售商店】目前共有:"+this.breadCnt()+"个面包"+this.breads.toString());

}

/**
* 给消费者销售面包
* @return
*/
public synchronized Bread sellBread(){
System.out.println("【面包零售商店】目前共有:"+this.breadCnt()+"个面包"+this.breads.toString());
while(this.breads.size() == 0 ){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//this.breads.notifyAll();
if(this.size == this.breads.size()){
notifyAll();
}

Bread bread = this.breads.get(0);
this.breads.remove(0);
return bread;
}

public synchronized int breadCnt(){
return this.breads.size();
}


public int getSize() {
return size;
}


public void setSize(int size) {
this.size = size;
}


}


package com.wxt.func.pv.noblokclist;


import org.apache.log4j.Logger;


/**
 * 消费者(吃面包的人)
 * @author dragon
 *
 */
public class Customer extends Thread{





private BreadShop breadShop;

public Customer(){

}
public Customer(String name,BreadShop breadShop){
this.breadShop = breadShop;
this.setName(name);
}

public void buyBread(){
this.start();
}

/**
* 消费者消费面包
*/
public void run(){
System.out.println("【"+Thread.currentThread().getName()+"】消费准备");
Bread bread = this.breadShop.sellBread();
try {
if(bread == null){
System.out.println("【"+Thread.currentThread().getName()+"】消费失败");
}else{
System.out.println("【"+Thread.currentThread().getName()+"】消费成功:"+"["+bread.getName()+","+bread.getColor()+"]面包");
}
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

0 0