eric_619 发表于 2013-2-4 20:01:09

java生产者消费者经典问题

/*@srchttp://eric-619.iteye.com/blog/693681* 生产者消费者问题其含义就是先生产出了产品,才能拉出去让消费者购买* 一、重点:*    1、多个线程数据共享区域化思想!---源于多线程的近亲思想!!(类似于静态变量的改变)*    (如栈内存和对内存,还有当做栈内存和堆内存,如数组和基本数据类型,只要是访问的同一个。)*    2、生产者消费者*    * 二、synchronized加锁:* */public class ProCon{ //主方法public static void main(String[] args){SyncStack stack = new SyncStack();Consumer p = new Consumer(stack);Producer c = new Producer(stack);new Thread(p).start();new Thread(c).start();}}class Producer implements Runnable{   //生产者    private SyncStack stack;    public Producer(SyncStack stack){    this.stack = stack;   }    public void run(){    for (int i = 0; i < stack.pro().length; i++){    String product = "产品"+i;    stack.push(product);    System.out.println("生产了: "+product);    try{   Thread.sleep(200);   }catch(InterruptedException e)      {       e.printStackTrace();   }   }}}class Consumer implements Runnable{   //消费者   private SyncStack stack;   public Consumer(SyncStack stack) {   this.stack = stack;    }      public void run(){   for(int i = 0; i < stack.pro().length; i++){    String product = stack.pop();    System.out.println("消费了: "+product);    try{   Thread.sleep(1000);   }catch(InterruptedException e){   e.printStackTrace();   }    }   }}class SyncStack{   // 此类是(本质上:共同访问的)共享数据区域private String[] str = new String;    private int index;      public synchronized void push(String sst){ //供生产者调用    if(index == sst.length()){   try{      wait();   }catch(InterruptedException e){       e.printStackTrace();      }    }   this.notify(); //唤醒在此对象监视器上等待的单个线程   str = sst;   index++;}   public synchronized String pop(){   //供消费者调用    if(index == 0){   try{      wait();      }catch (InterruptedException e){       e.printStackTrace();      }   }    notify();    index--;    String product = str;    return product;   }    public String[] pro(){ //就是定义一个返回值为数组的方法,返回的是一个String[]引用   return str;   //这是一个String[]引用   }}
页: [1]
查看完整版本: java生产者消费者经典问题