<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

    引子:
    大家上過(guò)操作系統(tǒng)的都知道“生產(chǎn)者-消費(fèi)者(Producer-Consumer)”模型,主要討論的是進(jìn)程(線程)間的互斥和同步問(wèn)題,關(guān)鍵是對(duì)鎖(lock)的申請(qǐng)、獨(dú)占和釋放,在這里我就不羅嗦了。原先我寫(xiě)的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對(duì)信號(hào)量及原語(yǔ)做了更高層次的封裝(wait()、notify()、notifyAll()、synchronized{}),但看完上述代碼還是覺(jué)得有點(diǎn)麻煩,于是JDK 5在原先collection框架的基礎(chǔ)上增加了java.util.concurrent包,封裝了許多用于線程并發(fā)操作的數(shù)據(jù)結(jié)構(gòu)和操作。其中的BlockingQueue接口就是封裝了一個(gè)阻塞隊(duì)列的接口,具體地說(shuō)就是實(shí)現(xiàn)了一個(gè)用于消費(fèi)者(多個(gè))和生產(chǎn)者(多個(gè))交換產(chǎn)品的中介,生產(chǎn)者線程在隊(duì)列滿(mǎn)時(shí)阻塞,消費(fèi)者線程在隊(duì)列空時(shí)阻塞,當(dāng)然在沒(méi)有得到鎖之前兩類(lèi)線程均會(huì)阻塞。詳細(xì)信息可以參考Java Doc。下面用BlockingQueue實(shí)現(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();
       }

     }


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

    FeedBack:
    # 發(fā)現(xiàn)一個(gè)問(wèn)題
    2011-09-11 11:48 | 劉sir
    你前半部分的消費(fèi)者線程搞的有問(wèn)題  回復(fù)  更多評(píng)論
      
    主站蜘蛛池模板: 精品一区二区三区免费毛片爱| 1000部拍拍拍18勿入免费视频下载 | a级成人免费毛片完整版| 99久久人妻精品免费一区| 日本大片在线看黄a∨免费| 亚洲精品高清国产一线久久| 亚洲伊人精品综合在合线| 午夜不卡AV免费| 最近中文字幕2019高清免费| 亚洲福利精品一区二区三区| 亚洲综合网美国十次| 三年片在线观看免费观看大全中国| 中文字幕免费视频一| 免费国产一级特黄久久| 亚洲免费视频网站| 无套内射无矿码免费看黄 | 最近免费中文字幕大全高清大全1 最近免费中文字幕mv在线电影 | 深夜福利在线免费观看| 毛片在线播放免费观看| 国产v片免费播放| 亚洲韩国在线一卡二卡| 一个人看的www在线免费视频 | 成年性生交大片免费看| 国产V亚洲V天堂无码久久久| 亚洲AV噜噜一区二区三区| 99re6在线视频精品免费下载| 亚洲国产a级视频| 亚洲三级在线视频| 国精产品一区一区三区免费视频| 国产网站在线免费观看| 亚洲国产精品日韩在线观看| 999zyz**站免费毛片| 免费v片视频在线观看视频| 亚洲国产成人久久| 成人片黄网站色大片免费观看APP| 国产小视频在线观看免费| 亚洲国产超清无码专区| 精品成人免费自拍视频| 亚洲女人被黑人巨大进入| 亚洲爆乳少妇无码激情| 日韩不卡免费视频|