Android(java)學習筆記71:生產者和消費者之等待喚醒機制

來源:互聯網
上載者:User

標籤:

首先我們根據梳理我們之前Android(java)學習筆記70中關於生產者和消費者程式思路:

 

下面我們就要重點介紹這個等待喚醒機制

第一步:還是先通過代碼體現出等待喚醒機制

package cn.itcast_05;/* * 分析: *         資源類:Student     *         設定學生資料:SetThread(生產者) *         擷取學生資料:GetThread(消費者) *         測試類別:StudentDemo *  * 問題1:按照思路寫代碼,探索資料每次都是:null---0 * 原因:我們在每個線程中都建立了新的資源,而我們要求的時候設定和擷取線程的資源應該是同一個 * 如何?呢? *         在外界把這個資料建立出來,通過構造方法傳遞給其他的類。 *  * 問題2:為了資料的效果好一些,我加入了迴圈和判斷,給出不同的值,這個時候產生了新的問題 *         A:同一個資料出現多次 *         B:姓名和年齡不匹配 * 原因: *         A:同一個資料出現多次 *             CPU的一點點時間片的執行權,就足夠你執行很多次。 *         B:姓名和年齡不匹配 *             線程啟動並執行隨機性 * 安全執行緒問題: *         A:是否是多線程環境        是 *         B:是否有共用資料        是 *         C:是否有多條語句操作共用資料    是 * 解決方案: *         加鎖。 *         注意: *             A:不同種類的線程都要加鎖。 *             B:不同種類的線程加的鎖必須是同一把。 *  * 問題3:雖然資料安全了,但是呢,一次一大片不好看,我就想依次的一次一個輸出。 * 如何?呢? *         通過Java提供的等待喚醒機制解決。 *  * 等待喚醒: *         Object類中提供了三個方法: *             wait():等待 *             notify():喚醒單個線程 *             notifyAll():喚醒所有線程 *         為什麼這些方法不定義在Thread類中呢? *             這些方法的調用必須通過鎖對象調用,而我們剛才使用的鎖對象是任意鎖對象。 *             所以,這些方法必須定義在Object類中。 */public class StudentDemo {    public static void main(String[] args) {        //建立資源        Student s = new Student();                //設定和擷取的類        SetThread st = new SetThread(s);        GetThread gt = new GetThread(s);        //線程類        Thread t1 = new Thread(st);        Thread t2 = new Thread(gt);        //啟動線程        t1.start();        t2.start();    }}

 

 1 package cn.itcast_05; 2  3 public class SetThread implements Runnable { 4  5     private Student s; 6     private int x = 0; 7  8     public SetThread(Student s) { 9         this.s = s;10     }11 12     @Override13     public void run() {14         while (true) {15             synchronized (s) {16                 //判斷有沒有17                 if(s.flag){18                     try {19                         s.wait(); //t1等著,釋放鎖20                     } catch (InterruptedException e) {21                         e.printStackTrace();22                     }23                 }24                 25                 if (x % 2 == 0) {26                     s.name = "林青霞";27                     s.age = 27;28                 } else {29                     s.name = "劉意";30                     s.age = 30;31                 }32                 x++; //x=133                 34                 //修改標記35                 s.flag = true;36                 //喚醒線程37                 s.notify(); //喚醒t2,喚醒並不表示你立馬可以執行,必須還得搶CPU的執行權。38             }39             //t1有,或者t2有40         }41     }42 }

 

 1 package cn.itcast_05; 2  3 public class GetThread implements Runnable { 4     private Student s; 5  6     public GetThread(Student s) { 7         this.s = s; 8     } 9 10     @Override11     public void run() {12         while (true) {13             synchronized (s) {14                 if(!s.flag){15                     try {16                         s.wait(); //t2就等待了。立即釋放鎖。將來醒過來的時候,是從這裡醒過來的時候17                     } catch (InterruptedException e) {18                         e.printStackTrace();19                     }20                 }21                 22                 System.out.println(s.name + "---" + s.age);23                 //林青霞---2724                 //劉意---3025                 26                 //修改標記27                 s.flag = false;28                 //喚醒線程29                 s.notify(); //喚醒t130             }31         }32     }33 }

 

1 package cn.itcast_05;2 3 public class Student {4     String name;5     int age;6     boolean flag; // 預設情況是沒有資料,預設是false,如果是true,說明有資料7 }

 

Android(java)學習筆記71:生產者和消費者之等待喚醒機制

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.