<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

    引子:
    大家上過操作系統(tǒng)的都知道“生產(chǎn)者-消費者(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包,封裝了許多用于線程并發(fā)操作的數(shù)據(jù)結構和操作。其中的BlockingQueue接口就是封裝了一個阻塞隊列的接口,具體地說就是實現(xiàn)了一個用于消費者(多個)和生產(chǎn)者(多個)交換產(chǎn)品的中介,生產(chǎn)者線程在隊列滿時阻塞,消費者線程在隊列空時阻塞,當然在沒有得到鎖之前兩類線程均會阻塞。詳細信息可以參考Java Doc。下面用BlockingQueue實現(xiàn)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();
       }

     }


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

    FeedBack:
    # 發(fā)現(xiàn)一個問題
    2011-09-11 11:48 | 劉sir
    你前半部分的消費者線程搞的有問題  回復  更多評論
      
    主站蜘蛛池模板: 激情综合亚洲色婷婷五月APP | 四虎影视在线永久免费观看| 中文字幕免费观看视频| 亚洲综合中文字幕无线码| 亚洲av无码一区二区乱子伦as| 国产jizzjizz免费视频| 国产h肉在线视频免费观看| 日韩电影免费在线观看| 国产精品免费久久久久影院| 亚洲精品无码aⅴ中文字幕蜜桃| 久久精品国产亚洲av水果派| 亚洲一区AV无码少妇电影☆| 国产又粗又长又硬免费视频| 在线观看视频免费国语| 久久精品国产免费观看三人同眠| A片在线免费观看| 国产黄片不卡免费| 直接进入免费看黄的网站| 亚洲狠狠婷婷综合久久蜜芽| 亚洲一区二区三区久久久久| 无码乱人伦一区二区亚洲| 久久亚洲精品视频| 在线亚洲97se亚洲综合在线| 国产成人亚洲综合无码| 亚洲AV蜜桃永久无码精品| 四虎永久成人免费| 免费无码又爽又刺激毛片| 噜噜嘿在线视频免费观看| a级毛片无码免费真人| 色老头永久免费网站| 日本高清在线免费| 成人免费视频69| 中文毛片无遮挡高潮免费| 黄网站色在线视频免费观看| 可以免费看黄视频的网站| 人成午夜免费视频在线观看| 午夜国产精品免费观看| 美女视频黄a视频全免费| 成人免费看黄20分钟| 日本人的色道www免费一区| 四虎永久免费地址在线网站|