zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    [Leetcode][Python][DP]Regular Expression Matching
    [LeetCode][Python]Container With Most Water
    [LeetCode][Python]Regular Expression Matching
    [LeetCode][Python]Palindrome Number
    [LeetCode][Python]Largest Number
    前后端数据交互的几个方法
    AngularJS中服务和自定义服务的常见方式及特点
    uniapp解决图形验证码问题及arraybuffer二进制转base64格式图片
    动态面包屑组件(适合嵌套路由)
    vue + antd-vue + 腾讯云点播 完成视频上传功能
  • 原文地址:https://www.cnblogs.com/pinxiong/p/3852417.html
Copyright © 2011-2022 走看看