你的位置:首页 > Java教程

[Java教程]java_Thread生产者与消费者 Demo


 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 wenfei103 */104 class Consumer implements Runnable {105   SyncStack ss = null;106 107   Consumer(SyncStack ss) {108     this.ss = ss;109   }110 111   @Override112   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 block121         e.printStackTrace();122       }123       // System.out.println(wt);124     }125   }126 127 }