1 package com.bjsxt.Thread.Demo; 2 public class ProducerConsumer { 3 /** 4 * 生产者与消费者 5 * @param args 6 */ 7 public static void main(String[] args) {// 模拟线程 8 SyncStack ss = new SyncStack(); 9 Producer p = new Producer(ss); 10 Consumer c = new Consumer(ss); 11 new Thread(p).start();// 开启线程 12 new Thread(c).start();// 开启线程 13 } 14 } 15 16 /** 17 * Woto类 18 */ 19 class WoTo { 20 int id; 21 WoTo(int id) { 22 this.id = id; 23 } 24 public String toString() { 25 return "WoTo : " + id; 26 } 27 } 28 29 /** 30 * 框类(用来装馒头) 31 * @author wenfei 32 */ 33 class SyncStack { 34 int index = 0; 35 WoTo[] arrwt = new WoTo[6]; 36 37 public synchronized void push(WoTo wt) { 38 39 while (index == arrwt.length) { 40 41 try { 42 this.wait();// 暂定当前对象 43 44 } catch (InterruptedException e) { 45 e.printStackTrace(); 46 } 47 } 48 this.notify();// 叫醒当前线程 49 arrwt[index] = wt; 50 index++; 51 } 52 53 public synchronized WoTo pop() { 54 while (index == 0) { 55 56 try { 57 this.wait(); 58 } catch (InterruptedException e) { 59 e.printStackTrace(); 60 } 61 } 62 this.notify(); 63 index--; 64 return arrwt[index]; 65 } 66 } 67 68 /** 69 * 生产者 70 * 71 * @author wenfei 72 */ 73 class Producer implements Runnable { 74 SyncStack ss = null; 75 76 Producer(SyncStack ss) { 77 this.ss = ss; 78 } 79 80 @Override 81 public void run() { 82 // 生产wt 83 for (int i = 0; i <= 100; i++) { 84 WoTo wt = new WoTo(i); 85 ss.push(wt);// 往篮子里装窝头 86 System.out.println("生产了--->" + wt); 87 try { 88 // Thread.sleep(1000);//每生产一个睡眠一秒 89 Thread.sleep((int) Math.random() * 1000); 90 } catch (InterruptedException e) { 91 // TODO Auto-generated catch block 92 e.printStackTrace(); 93 } 94 } 95 } 96 97 } 98 99 /** 100 * 消费者 101 * 102 * @author wenfei 103 */ 104 class Consumer implements Runnable { 105 SyncStack ss = null; 106 107 Consumer(SyncStack ss) { 108 this.ss = ss; 109 } 110 111 @Override 112 public void run() { 113 for (int i = 0; i <= 100; i++) { 114 WoTo wt = ss.pop(); 115 System.out.println("消费了--->" + wt); 116 try { 117 // Thread.sleep(1000);//每消费一个睡眠一秒 118 Thread.sleep((int) Math.random() * 1000);// 119 } catch (InterruptedException e) { 120 // TODO Auto-generated catch block 121 e.printStackTrace(); 122 } 123 // System.out.println(wt); 124 } 125 } 126 127 }
时间: 2024-10-03 20:47:23