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

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

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

    Liver's Java
    我不夠貪心!其實我應該明白,心有多貪,舞臺就會有多大!堅持!奮斗!
    posts - 4,  comments - 6,  trackbacks - 0
    昨天提到了線程,那么就不得不提到“生產者與消費者”這樣一個經典的線程同步問題。

    場景描述:
        一個倉庫,生產者在工廠里生產了產品后,將產品存放到倉庫里,倉庫存放數量有限,當滿倉后,停止生產,直到有消費著將產品消費后才繼續生產;消費者從倉庫里提取產品,當倉庫空倉時,停止消費產品,直到倉庫中有產品時,才繼續消費產品。

    代碼的實現(調整線程sleep時間可以實現生產速度與消費速度的不同):
    TestProduceAndConsumer.java
    package com.nantian;

    import java.util.Random;

    public class TestProduceAndConsumer {
        
    public static void main(String[] args) {
            
    // 創建一個工廠對象
            ProductFactory pf = new ProductFactory();
            
    // 創建一個生產者和一個消費者,傳遞工廠的引用,保證兩者操作的是同一個工廠
            Producer p = new Producer(pf);
            Consumer c 
    = new Consumer(pf);
            
    // 啟動兩個線程
            p.start();
            c.start();
        }

    }


    // 產品工廠
    class ProductFactory {
        
    // product表示倉庫
        private char[] product = ' '' '' '' '' '};
        
    // flag標記產品數量
        private int flag = 0;

        
    // 生產產品
        public synchronized void produceProduct(char p) throws InterruptedException {
            
    // 判斷產品是否滿倉,以便決定是否繼續生產
            if (flag == product.length) {
                
    this.wait();
            }

            
    // 當代碼執行到這里,一定不是滿倉狀態
            product[flag++= p;
            
    // 查看此時倉庫狀態(這里不屬于業務邏輯部分)
            System.out.print(p + "被生產,當前倉庫狀態:");
            
    for (char tmp : product) {
                System.out.print(tmp);
            }

            System.out.println();
            
    // 生產方法完成,如果存在等待隊列中的線程,應該喚醒
            this.notifyAll();
        }

        
        
    // 消費產品
        public synchronized char consumeProduct() throws InterruptedException {
            
    // 判斷倉庫是否空倉,以便決定是否消費產品
            if(flag == 0{
                
    this.wait();
            }

            
    // 當代碼執行到這里,一定不是空倉狀態
            char p = product[--flag]; product[flag]=' ';
            
    // 查看此時倉庫狀態(這里不屬于業務邏輯部分)
            System.out.print(p + "被消費,當前倉庫狀態:");
            
    for(char tmp : product) {
                System.out.print(tmp);
            }

            System.out.println();
            
    // 消費方法完成,如果存在等待隊列中的線程,應該喚醒
            this.notifyAll();
            
    return p;
        }

    }


    // 生產者
    class Producer extends Thread {
        
    private ProductFactory pf = null;
        
        
    public Producer(ProductFactory pf) {
            
    this.pf = pf;
        }

        
        
    public void run() {
            
    // 一共生產20個產品
            for(int i=0; i<20; i++{
                
    // 隨機產生一個大寫字母作為產品
                Random r = new Random();
                
    char p = (char)(r.nextInt(26+ 'A');
                
    try {
                    
    // 產品入庫
                    pf.produceProduct(p);
                    
    // 故意sleep,以便消費線程有機會獲得CPU時間片,方便演示
                    Thread.sleep(200);
                }
     catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }

        }

    }


    // 消費者
    class Consumer extends Thread {
        
    private ProductFactory pf = null;
        
        
    public Consumer(ProductFactory pf) {
            
    this.pf = pf;
        }

        
        
    public void run() {
            
    // 一共消費20個產品
            for(int i=0; i<20; i++{
                
    try {
                    
    // 產品出庫
                    pf.consumeProduct();
                    
    // 故意sleep,以便生產線程有機會獲得CPU時間片,方便演示
                    
    // sleep時間稍微錯開,阻止同時競爭CPU時間片
                    Thread.sleep(300);
                }
     catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }

        }

    }
    posted on 2009-06-04 10:57 Liver 閱讀(1434) 評論(4)  編輯  收藏 所屬分類: CoreJava

    FeedBack:
    # re: 再談線程:生產者與消費者
    2009-06-04 16:22 | wuzhongxing
    利用jdk1.5的concurrent包里面的blockqueue,實現這種模式還是比較簡單的  回復  更多評論
      
    # re: 再談線程:生產者與消費者
    2009-06-04 18:10 | 樂蜂
    實現這種模式還是比較簡單的  回復  更多評論
      
    # re: 再談線程:生產者與消費者[未登錄]
    2009-06-06 16:57 | charlee
    // 判斷產品是否滿倉,以便決定是否繼續生產
    if (flag == product.length) {
    this.wait();
    }

    // 判斷倉庫是否空倉,以便決定是否消費產品
    if(flag == 0) {
    this.wait();
    }

    為什么要用if呢?你不覺得while更好么?  回復  更多評論
      
    # re: 再談線程:生產者與消費者
    2009-06-15 15:53 | 分享愛的空間
    言簡意賅,不錯。。。。
    希望看到更加深入的。  回復  更多評論
      

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     

    <2009年6月>
    31123456
    78910111213
    14151617181920
    21222324252627
    2829301234
    567891011

    常用鏈接

    留言簿

    隨筆分類(5)

    隨筆檔案(5)

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 国产精品成人亚洲| 亚洲欧洲国产成人精品| 羞羞漫画页面免费入口欢迎你| 久久成人国产精品免费软件| 亚洲国产天堂久久综合网站| A片在线免费观看| 亚洲AV成人一区二区三区AV| 久久久久久久99精品免费观看| 亚洲成AV人片在线观看无码| free哆啪啪免费永久| 亚洲精品成人网站在线播放| 亚洲毛片在线免费观看| 亚洲成a人片在线观看老师| 亚洲色无码国产精品网站可下载| 在线观看免费大黄网站| 日本亚洲中午字幕乱码| 久久精品亚洲福利| 亚洲Av永久无码精品黑人| 亚洲av无码无在线观看红杏| 亚洲人成欧美中文字幕| 浮力影院第一页小视频国产在线观看免费| 亚洲国产精品久久久久秋霞小| 四虎影视在线永久免费看黄| 巨胸喷奶水www永久免费| 国产亚洲人成网站在线观看不卡| 小草在线看片免费人成视久网| 国产一区二区视频免费| 一区二区三区在线免费| 亚洲性天天干天天摸| 日韩一级免费视频| 中国在线观看免费的www| 亚洲精品国产福利片| 国产美女无遮挡免费视频网站 | 中文永久免费观看网站| 亚洲高清在线播放| 国产在线98福利播放视频免费| 又硬又粗又长又爽免费看| 久久久亚洲欧洲日产国码aⅴ| 国产精品另类激情久久久免费| a级毛片免费完整视频| 亚洲高清中文字幕免费|