<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    午夜拍鍵驚奇
    子夜 編程 代碼與我同在
    posts - 48,comments - 118,trackbacks - 79

    引子:
    大家上過操作系統的都知道“生產者-消費者(Producer-Consumer)”模型,主要討論的是進程(線程)間的互斥和同步問題,關鍵是對鎖(lock)的申請、獨占和釋放,在這里我就不羅嗦了。原先我寫的Java代碼如下:

    public class Producer extends Thread{
      
    private ProductList products = ProductList.getInstance();
      
      
    public void run(){
        
    int i = 0;
        
        
    while(i <= 20){
          
    synchronized(products)// Get lock on product list
        if(products.isFull()){
          System.out.println(
    "List is full");
          products.notify(); 
    // Release the lock
        }
     else{
          Product product 
    = new Product(i++); // Produce a product
          products.put(product);
          System.out.println(
    "Produced product " + product.getId());
          products.notify(); 
    // Release lock
        }

          }
     // Release the lock
        }

      }

    }

    public class Consumer extends Thread{
      ProductList products 
    = ProductList.getInstance();
      
      
    public void run(){
        
    while(true){
          
    synchronized(products){
        
    try {
          products.wait(); 
    // Wait for lock
          Product product = null;
          
    if(!(products.isEmpty()))
            product 
    = products.take();
          
    else
            System.out.println(
    "List is empty");
          System.out.println(
    "Consumed product " + product.getId()); // Get the lock
        }
     catch (InterruptedException ex) {
          ex.printStackTrace();
        }

          }
     // Release the lock
        }

      }

    }


    import java.util.ArrayList;
    import java.util.List;

    public class ProductList {
      
    private static ProductList instance = new ProductList();
      
    private List<Product> products; // Adapter pattern
      public static final int SIZE = 10;
      
      
    private ProductList() {
        products 
    = new ArrayList<Product>(SIZE);
      }

      
      
    public static ProductList getInstance() // Singleton pattern
        return instance;
      }

      
      
    public boolean isFull() {
        
    return products.size() == SIZE;
      }

      
      
    public void put(Product product) {
        products.add(product);
      }

      
      
    public Product take() {
        
    return products.remove(0);
      }

      
      
    public boolean isEmpty() {
        
    return products.isEmpty();
      }

    }


    public class Product {
      
    private int id;
      
      
    public Product(int id) {
        
    this.id = id;
      }

      
      
    public int getId() {
        
    return id;
      }

    }


    public class Main {
      
    public static void main(String[] args){
        Producer p 
    = new Producer();
        Consumer c 
    = new Consumer();
        
        p.start();
        c.start();
      }

    }


    雖然Java對信號量及原語做了更高層次的封裝(wait()、notify()、notifyAll()、synchronized{}),但看完上述代碼還是覺得有點麻煩,于是JDK 5在原先collection框架的基礎上增加了java.util.concurrent包,封裝了許多用于線程并發操作的數據結構和操作。其中的BlockingQueue接口就是封裝了一個阻塞隊列的接口,具體地說就是實現了一個用于消費者(多個)和生產者(多個)交換產品的中介,生產者線程在隊列滿時阻塞,消費者線程在隊列空時阻塞,當然在沒有得到鎖之前兩類線程均會阻塞。詳細信息可以參考Java Doc。下面用BlockingQueue實現P-C模型:

    class Producer implements Runnable {
       
    private final BlockingQueue queue;
       Producer(BlockingQueue q) 
    { queue = q; }
       
    public void run() {
         
    try {
           
    while(true{ queue.put(produce()); }
         }
     catch (InterruptedException ex)  handle }
       }

       Object produce() 
     }
     }


     
    class Consumer implements Runnable {
       
    private final BlockingQueue queue;
       Consumer(BlockingQueue q) 
    { queue = q; }
       
    public void run() {
         
    try {
           
    while(true{ consume(queue.take()); }
         }
     catch (InterruptedException ex)  handle }
       }

       
    void consume(Object x)  }
     }


     
    class Setup {
       
    void main() {
         BlockingQueue q 
    = new SomeQueueImplementation();
         Producer p 
    = new Producer(q);
         Consumer c1 
    = new Consumer(q);
         Consumer c2 
    = new Consumer(q);
         
    new Thread(p).start();
         
    new Thread(c1).start();
         
    new Thread(c2).start();
       }

     }


    可以看出代碼中沒有出現wait()或notify()之類的原語操作,這些操作由concurrent框架負責封裝。更全面的討論可以參考馴服 Tiger: 并發集合(IBM)
    posted on 2005-10-11 16:56 ^ Mustang ^ 閱讀(13668) 評論(1)  編輯  收藏 所屬分類: Java 點滴

    FeedBack:
    # 發現一個問題
    2011-09-11 11:48 | 劉sir
    你前半部分的消費者線程搞的有問題  回復  更多評論
      
    主站蜘蛛池模板: 国产成人无码综合亚洲日韩| 亚洲va国产va天堂va久久| 免费一级全黄少妇性色生活片 | 国产亚洲AV手机在线观看| 曰批全过程免费视频在线观看无码| 97久久精品亚洲中文字幕无码| 无码人妻一区二区三区免费手机| 亚洲AV无码一区二区三区网址 | 午夜免费福利小电影| 亚洲AV永久无码精品网站在线观看| 免费人妻无码不卡中文字幕18禁| 在线人成免费视频69国产| 亚洲人精品亚洲人成在线| 中文亚洲AV片在线观看不卡 | 亚洲一区二区中文| 国产成人免费福利网站| 久久精品国产影库免费看| 亚洲精品成a人在线观看夫| 亚洲国产精彩中文乱码AV| 国产成人在线免费观看| 免费A级毛片无码A∨免费| 九九综合VA免费看| 亚洲三级高清免费| 亚洲AV无码第一区二区三区| 欧洲精品免费一区二区三区| 免费女人高潮流视频在线观看| 黄色a三级免费看| 亚洲av日韩av综合| 亚洲精品免费视频| 亚洲一级Av无码毛片久久精品| 91免费资源网站入口| 中国一级特黄的片子免费 | 国产亚洲av片在线观看18女人| 中文字幕无码视频手机免费看| 最新国产乱人伦偷精品免费网站| 特级aaaaaaaaa毛片免费视频| 亚洲日本人成中文字幕| 亚洲国产精品不卡在线电影| 亚洲午夜激情视频| 青青草国产免费久久久下载| 黄页网站在线看免费|