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

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

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

    posts - 14,  comments - 7,  trackbacks - 0
           今天我們用實例程序說一下java中常見的生產者與消費者的問題。

     首先看一下里面線程間的通信問題:


       一個線程向數據存儲空間添加數據(生產者),另一個線程從數據存儲空間去出數據(消費者)。

    這個程序中有兩個可能出現的問題需要考慮:

    1、         假設生產者線程剛向數據存儲空間添加了一個食品的名字,還沒有加入這個食品的屬性,CPU就切換到了消費者線程,消費者線程將把這個食品的名字和這個人的屬性聯系在一起。

    2、         消費者拿東西都希望自己拿到的是最新的,即生產者剛生產出,消費者就拿走,而不是拿一些陳舊的。可能出現消費者拿不了最新的在程序中的原因,生產者放了若干次的數據,消費者才開始取數據,或者是,消費者取完一個數據后,還沒等到生產者放入新的數據,即消費者比生產者快時,又重復取出這個數據

        下面我們看一下具體的代碼,來體驗一下生產者與消費者的關系,平我們去吃麥當勞時,總會要點吃的喝的,比如我們吃個漢堡喝個咖啡,而且這些都要是最新的,都是他們現做的。

    package com.dr.blog;

    class M{
        String name 
    = "Hamberger";
        String proper
    ="吃的";
        
    boolean flag = false;
    }

    class Pro implements Runnable{
        M m 
    = null;
        
    public Pro(M m){
            
    this.m=m;
        }

        
    public void run(){
            
    int i = 0;
            
    while(true){
                
    if(i==0){
                    m.name
    ="Hamberger";
                    m.proper
    ="吃的";
                    i
    =1;
                }
    else{
                    m.name
    ="cofe";
                    m.proper
    ="喝的";
                    i
    =0;
                }

            }

        }

    }

    class Cus implements Runnable{
        M m 
    = null;
        
    public Cus(M m){
            
    this.m= m;
        }

        
    public void run(){
            
    while(true){
                
    try {
                    Thread.sleep(
    100);
                }
     catch (InterruptedException e) {
                    
    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                System.out.println(m.name
    +"----->"+m.proper);
                
            }

        }

    }

    public class ThreadDemo02{
        
    public static void main(String[] args){
            M m 
    = new M();
            Pro p 
    = new Pro(m);
            Cus c 
    = new Cus(m);
            
    new Thread(p).start();
            
    new Thread(c).start();
        }

    }

    運行結果如下:

    可以看出這里出現了漢堡是喝的,咖啡是吃的的情況,也就是上面我們說的第一種情況,這個可以通過synchronized實現同步來解決,因為資源共享需要同步。
    package com.dr.blog;

    class M1 {
        String name 
    = "Hamberger";
        String proper 
    = "吃的";
        
    //boolean flag = false;

        
    public synchronized void set(String name,String proper){
            
    //if(!flag){
                this.name= name;
                
    this.proper=proper;
                
    //flag = false;
            
    //}
        }

         
    public synchronized void get(){
            
    //if(flag){
                System.out.println(this.name+"----->"+this.proper);
                
    //flag = true;
                
    //        }
                    }

        
    }


    class Pro1 implements Runnable {
        M1 m 
    = null;

        
    public Pro1(M1 m) {
            
    this.m = m;
        }


        
    public void run() {
            
    int i = 0;
            
    while (true{
                
    if (i == 0{
    //                m.name = "Hamberger";
    //                m.proper = "吃的";
                    m.set("Hamberger""吃的");
                    i 
    = 1;
                }
     else {
    //                m.name = "cofe";
    //                m.proper = "喝的";
                    m.set("cofe""喝的");
                    i 
    = 0;
                }

            }

        }

    }


    class Cus1 implements Runnable {
        M1 m 
    = null;

        
    public Cus1(M1 m) {
            
    this.m = m;
        }


        
    public void run() {
            
    while (true{
                
    try {
                    Thread.sleep(
    100);
                }
     catch (InterruptedException e) {
                    
    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                m.get();
                
    //System.out.println(m.name + "----->" + m.proper);
            }

        }

    }


    public class ThreadDemo01 {

        
    public static void main(String[] args) {
            M1 m 
    = new M1();
            Pro1 p 
    = new Pro1(m);
            Cus1 c 
    = new Cus1(m);
            
    new Thread(p).start();
            
    new Thread(c).start();
        }


    }



     

    第一個問題已經解決啦,但第二個問題還是存在,這個問題我們可以用線程的等待喚醒機制即wait(),notify()方法來解決

    Wait()告訴當前線程放棄監視器并進入睡眠狀態,直到其他線程進入同一監視器并調用notify()為止

    Notify()喚醒同一對象監視器中調用wait()的第一線程


    package com.dr.blog;

    //package com.dr.blog;

    class M2 {
        String name 
    = "Hamberger";
        String proper 
    = "吃的";
        
    boolean flag = false;

        
    public synchronized void set(String name,String proper){
            
    if(!flag){
                
    try{
                    wait();
                }
    catch(InterruptedException e){
                    e.printStackTrace();
                }

                
    this.name= name;
                
    this.proper=proper;
                flag 
    = false;
                notify();
            }

        }

         
    public synchronized void get(){
            
    if(flag){
                
    try {
                    wait();
                }
     catch (InterruptedException e) {
                    
    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                System.out.println(
    this.name+"----->"+this.proper);
                flag 
    = true;
                notify();
                        }

                    }

        
    }


    class Pro2 implements Runnable {
        M2 m 
    = null;

        
    public Pro2(M2 m) {
            
    this.m = m;
        }


        
    public void run() {
            
    int i = 0;
            
    while (true{
                
    if (i == 0{
    //                m.name = "Hamberger";
    //                m.proper = "吃的";
                    m.set("Hamberger""吃的");
                    i 
    = 1;
                }
     else {
    //                m.name = "cofe";
    //                m.proper = "喝的";
                    m.set("cofe""喝的");
                    i 
    = 0;
                }

            }

        }

    }


    class Cus2 implements Runnable {
        M2 m 
    = null;

        
    public Cus2(M2 m) {
            
    this.m = m;
        }


        
    public void run() {
            
    while (true{
                
    try {
                    Thread.sleep(
    100);
                }
     catch (InterruptedException e) {
                    
    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                m.get();
                
    //System.out.println(m.name + "----->" + m.proper);
            }

        }

    }


    public class ThreadDemo03 {

        
    public static void main(String[] args) {
            M2 m 
    = new M2();
            Pro2 p 
    = new Pro2(m);
            Cus2 c 
    = new Cus2(m);
            
    new Thread(p).start();
            
    new Thread(c).start();
        }


    }



    現在我們開始說的兩個問題已經解決啦!!
    posted on 2010-11-10 23:07 迷人笑笑 閱讀(2157) 評論(1)  編輯  收藏

    FeedBack:
    # re: java中消費者與生產者的問題實例解析
    2010-12-14 17:17 | aben
    樓主有沒有搞錯啊 你的最后那個截圖后面不還是亂的嗎 不是一個一個交替輸出的啊  回復  更多評論
      

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


    網站導航:
     
    <2010年11月>
    31123456
    78910111213
    14151617181920
    21222324252627
    2829301234
    567891011

    常用鏈接

    留言簿(13)

    隨筆檔案

    文章檔案

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 一区二区在线免费观看| 欧洲亚洲综合一区二区三区| 99久久免费国产精品热| 亚洲午夜福利精品久久| 大片免费观看92在线视频线视频| 免费国产成人午夜电影| 久久亚洲中文字幕无码| 国产日本亚洲一区二区三区| 2021精品国产品免费观看| 久久久久亚洲AV片无码下载蜜桃 | 亚洲国产精品18久久久久久| 在线v片免费观看视频| 中文字幕亚洲综合久久综合| 免费观看男人免费桶女人视频| 亚洲精品无码少妇30P| 一个人免费视频观看在线www| 久久久久久a亚洲欧洲aⅴ| 国产午夜精品久久久久免费视 | 两个人的视频www免费| 亚洲日韩精品一区二区三区| 久久免费观看国产精品| 亚洲综合男人的天堂色婷婷| 成年人在线免费观看| 黄页网站在线免费观看| 亚洲日韩精品一区二区三区| 3d成人免费动漫在线观看| 亚洲videosbestsex日本| 日韩人妻无码免费视频一区二区三区 | 久久国产成人精品国产成人亚洲| 中国一级毛片视频免费看| 久久久久亚洲AV无码网站| 免费毛片网站在线观看| 一本久久免费视频| 久久亚洲精品成人777大小说| 114一级毛片免费| 香蕉视频在线观看免费| 亚洲AV日韩AV永久无码绿巨人| 国产一精品一AV一免费孕妇| 边摸边吃奶边做爽免费视频99 | 国产亚洲无线码一区二区| 日韩视频在线精品视频免费观看 |