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]