java notify() wait() synchronized 生產者與消費者案例


懶得寫了,直接看代碼把

手機類

/**
 * 手機類
 * 最多生產多少手機
 * @author HWUA
 *
 */
public class Shouji{
    public int max; //定義容器最大容量
    public int currentNum;//定義容器當前容量
     
    public Shouji(int max){
        this.max = max;
        currentNum = 0;
    }
}

生產類

//生產手機類
public class Sjphone1 implements Runnable{
    public Shouji con;
    public Sjphone1(Shouji con){//構造函數
        this.con = con;
    }
    public void run(){
        while(true){//一直運行
            synchronized(con){//手機類鎖
                if(con.currentNum < con.max){//若當前容器不滿,則可以生產
                    con.notify();//生產完則通知並釋放鎖
                    con.currentNum++;
                    System.out.println(" 生產者正在生產小米手機1部, 當前產品數:"+con.currentNum+"部");
                }else if(con.currentNum == con.max){//若生產手機等於最大定義手機市場容量
                    System.out.println("手機生產已經飽和,生產者停止生產,正在等待消費..."); 
                    try {
                        con.wait();//暫停生產 並釋放鎖
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }//if else if               
            }//syn  執行完同步塊  釋放鎖,輸出結果中連續出現兩次生產者是因為:釋放鎖后,若沒有等待線程,則還是先執行到哪個線程的同步塊就執行它
             
            try {
                Thread.sleep(100);//調節生產者頻率,過快容易猝死~~
            } catch (InterruptedException e) {
                e.printStackTrace();
            }//try
        }//while
    }
}

消費類

//消費類
public class Sjphone2 implements Runnable{
    public Shouji con;
    public Sjphone2(Shouji con){//構造函數
        this.con = con;
    }
    public void run(){
        while(true){//一直運行
            synchronized(con){//手機鎖
                if(con.currentNum > 0 ){//當有手機的時候
                    con.notify();//購買手機 並釋放鎖
                    con.currentNum--;
                    System.out.println(" 消費者正在消費小米手機賣出1部, 當前產品數:"+con.currentNum+"部");
                }else if(con.currentNum == 0){//若沒有手機了
                    System.out.println("手機已經買完了,消費者停止消費,正在等待生產..."); 
                    try {
                        con.wait();//暫停消費 並釋放鎖
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }//else if              
            }//syn      
             
            try {
                Thread.sleep(140);//調節消費者頻率,過快容易撐死~~
            } catch (InterruptedException e) {
                e.printStackTrace();
            }//try
        }//while
    }// run
}

測試類main

/**
 * 測試類
 */
public class Dome01{
    public static void main(String args[]){
        Shouji container = new Shouji(5);//定義最大定義手機市場容量,此處為5
        Sjphone1 sj1 =  new Sjphone1(container);//箱子中的手機數要同步,所以將手機對象引用作為形參傳給生產者和消費者
        Sjphone2 sj2 = new Sjphone2(container);//同上
        //啟動生產消費模式
        new Thread(sj1, "生產").start();
        new Thread(sj2, "消費").start();
        
    }
}

注意記得鎖的對象一定要是

構造函數  對應
Shouji 類

同一個對象,不然線程會亂跑,沒有規律,一定要鎖起來


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM