java 多线程经典例子——生产者与消费者的问题

来源:互联网 发布:ubuntu 镜像 知乎 编辑:程序博客网 时间:2024/05/16 09:38
产品名称类:
public class Product {//产品名称private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}}
生产者类:
/** * 生产者 * @author 饭香 * */public class Producer implements Runnable{private Shop shop;//要去送货的商店public Producer(Shop shop){this.shop=shop;}public void run() {for(int i=0;i<100;i++){shop.produ();}} }

消费者类

/** * 消费者 * @author 饭香 * */public class Cousumer implements Runnable{private Shop shop;//要去消费的商店public Cousumer(Shop shop){this.shop=shop;}public void run() {for(int i=0;i<100;i++){//消费100次shop.cousu();}}}
模拟商店(一切围绕商店,商店只能有一个,产品随便多个实例.这个也是别人问我总是出错的地方.对象思想) 
import java.util.ArrayList;import java.util.List;/** * 模拟商店 (进货/销售) * @author fx * */public class Shop {private static int i=0;//产品的容器;达到容器暂停生产,消费到0等待生产private static List<Product> list;static{list= new ArrayList<Product>();}/** * 生产产品 */public synchronized void produ(){if(list.size()>=5){try {System.out.println("--------------生产商品"+i+"时,达到了总数暂停生产-------");this.wait();//进入休眠} catch (InterruptedException e) {System.out.println(e.toString()); e=null;}} //生产商品Product product= new Product();product.setName("商品"+i);list.add(product);System.out.println("生产了商品---->"+product.getName()+"商品总数"+i);System.out.println("容器容量"+list.size());i++;super.notify();}/** * 消费产品 * @return */public synchronized void cousu(){if(list.size()==0){//消费完时,挂起System.out.println("+++++++++++++++++++++++商品消费完了.等待+++++++++++++++=");try {this.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blockSystem.out.println(e.toString()); e=null;}}Product product=list.get(0);list.remove(0);System.out.println("消费了获得了商品-->"+product.getName());System.out.println("容器容量"+list.size());super.notify();}}

测试代码类:

public static void main(String[] args) {Shop shop=new Shop();//商店Producer pro=new Producer(shop);Cousumer cou = new Cousumer(shop); new Thread(pro,"pro").start();     new Thread(cou,"cou").start();}

 转自:  http://51even.iteye.com/blog/767935