首页 > 代码库 > Producter and Consumer

Producter and Consumer

  1 package pinx.thread;  2   3 import java.util.LinkedList;  4 import java.util.Queue;  5   6 public class ProducerConsumer {  7   8     Storage storage=null;  9     Query query=null; 10     public ProducerConsumer(int max){ 11         storage=new Storage(max); 12         query=new Query(); 13     } 14      15     public void start(){ 16         Producter producter=new Producter(); 17         Consumer consumer=new Consumer(); 18         Thread thread1=new Thread(producter); 19          20         Thread thread2=new Thread(consumer); 21         Thread thread3=new Thread(consumer); 22         Thread thread4=new Thread(consumer); 23          24         thread1.start(); 25         thread2.start(); 26         thread3.start(); 27         thread4.start(); 28     } 29      30     /** 31      * @param args 32      */ 33     public static void main(String[] args) { 34         ProducerConsumer pc=new ProducerConsumer(20); 35         pc.start(); 36     } 37  38     class Product { 39         private int id; 40  41         public Product(int id) { 42             this.id = id; 43         } 44  45         public String toString() { 46             return "Product " + this.id; 47         } 48     } 49      50     class Query{ 51         public Query(){} 52         public synchronized int get(){ 53             return -1; 54         } 55     } 56  57     class Storage { 58         Queue<Product> queue = null; 59         int max = 0; 60  61         public Storage(int max) { 62             this.max = max; 63             this.queue = new LinkedList<Product>(); 64         } 65  66         public synchronized void push(Product product) { 67             while (this.max == this.queue.size()) { 68                 try { 69                     this.wait(); 70                 } catch (InterruptedException e) { 71                     e.printStackTrace(); 72                 } 73             } 74             this.queue.offer(product); 75             System.out.println("Producter has generated a product :" 76                     + product.toString()); 77             this.notifyAll(); 78         } 79  80         public synchronized Product pop() { 81             while (this.queue.isEmpty()) { 82                 try { 83                     this.wait(); 84                 } catch (InterruptedException e) { 85                     e.printStackTrace(); 86                 } 87             } 88             Product product = this.queue.poll(); 89             System.out.println("Consumer has consumed a product :" 90                     + product.toString()+" ~~~"); 91             return product; 92         } 93     } 94  95     class Consumer implements Runnable { 96  97         public void run() { 98             while(true){ 99                 System.out.println(String.format("Producter get the query value : %d", query.get()));100                 storage.pop();101                 try {102                     Thread.sleep((int)(Math.random()*1000));103                 } catch (InterruptedException e) {104                     e.printStackTrace();105                 }106             }107         }108     }109 110     class Producter implements Runnable {111 112         public void run() {113             int index=0;114             while(true){115                 System.out.println(String.format("Producter get the query value : %d~~~~~~~~~~~~~~~~~~~", query.get()));116                 storage.push(new Product(++index));117                 try {118                     Thread.sleep((int)(Math.random()*1000));119                 } catch (InterruptedException e) {120                     e.printStackTrace();121                 }122             }123         }124     }125 126 }