首页 > 代码库 > Java 多线程 生产者消费者问题

Java 多线程 生产者消费者问题

 1 package producer; 2  3 public class SyncStack { 4     int index =0; 5     SteamedBun[] bunArr = new SteamedBun[6];        //栈里只能放6个元素 6      7     public synchronized void push(SteamedBun bun) 8     { 9         while(index >= bunArr.length)                //栈满等待10         {11             bun.setIndex(bunArr.length -1);            //修正馒头编号12             try {13                 this.wait();14             } catch (InterruptedException e) {15                 // TODO Auto-generated catch block16                 e.printStackTrace();17             }18         }19         //this.notify();                            //单个线程时调用20         this.notifyAll();                            //广播给所有大厨21         22         bunArr[index] = bun;23         index++;24     }25     26     public synchronized SteamedBun pop()27     {28         while(index ==0)                            //栈空,没有馒头时等待生产29         {30             try {31                 this.wait();32             } catch (InterruptedException e) {33                 // TODO Auto-generated catch block34                 e.printStackTrace();35             }36         }37         this.notify();                                //通知吃货有馒头了38         39         index--;40         return bunArr[index];41     }42     43     44 }
 1 package producer; 2  3 public class Producer implements Runnable{ 4     SyncStack ss = null; 5     int pId; 6     public Producer(SyncStack ss,int pId) { 7         this.ss = ss; 8         this.pId = pId; 9     }10     11     @Override12     public void run() {13         // TODO Auto-generated method stub14         for(int i=0;i<10;i++)15         {16             SteamedBun bun = new SteamedBun(ss.index,pId*1000+i);17             ss.push(bun);18             System.out.println("****做了"+bun);19             20             try {21                 int iRandom = (int)(Math.random()*2000);22                 Thread.sleep(iRandom);23             } catch (InterruptedException e) {24                 // TODO Auto-generated catch block25                 e.printStackTrace();26             }27         }28     }29 30 }
 1 package producer; 2  3 public class Consumer implements Runnable{ 4  5     SyncStack ss = null; 6     public Consumer(SyncStack ss) 7     { 8         this.ss = ss; 9     }10     11     @Override12     public void run() {13         // TODO Auto-generated method stub14         for(int i= 0;i<30;i++)15         {16             SteamedBun bun = ss.pop();17             System.out.println("吃了 "+bun);18             19             try {20                 Thread.sleep((int)(Math.random()* 1000));21             } catch (InterruptedException e) {22                 // TODO Auto-generated catch block23                 e.printStackTrace();24             }25         }26     }27 28 }
 1 package producer; 2  3 public class SteamedBun { 4     private int id; 5     private int index; 6     public SteamedBun(int index,int id) { 7         this.id = id; 8         this.index = index; 9     }10     11     public String toString()12     {13         return "一个馒头,是筐里的第" + (index+1) + "个馒头,编号"+id;14     }15     16     public void setIndex(int index) {17         this.index = index;18     }19 }
 1 package producer; 2  3 public class Test { 4     public static void main(String[] args) { 5         SyncStack ss = new SyncStack(); 6          7         //new 3个大厨和1个吃货的线程 8         new Thread(new Producer(ss,1)).start(); 9         new Thread(new Producer(ss,2)).start();10         new Thread(new Producer(ss,3)).start();11         12         Consumer consumer = new Consumer(ss);13         new Thread(consumer).start();14     }15 }

 

Java 多线程 生产者消费者问题