未經過處理的**如下
}這裡有兩個問題:
首先是對於info物件,生產者可能只新增了webname的資訊,而沒有來得及新增link資訊,程式就切換到了消費者執行緒,消費者執行緒將webname和上乙個info物件的link聯絡到一起。
生產者存放了若干次的資料,消費者才開始讀取資料,或者是消費者取完乙個資料後,還沒等生產者放入新的資料,又重複取出已經取過的資料。
給info類加上兩個同步方法get()和set():
class info
public void setwebname(string webname)
public string getlink()
public void setlink(string link)
public synchronized void set( string webname, string link ) catch (exception e) {}
this.link = link;
}public synchronized void get() catch (exception e) {}
system.out.println("消費:" + this.getwebname() + "---->" + this.getlink());
}}
同時在生產者與消費者中分別呼叫這兩個方法:
class producer implements runnable
public void run() else }}
}
class consumer implements runnable
public void run() catch (exception e) {}
this.info.get();}}
}
修改info的set和get方法,加入等待與喚醒,在生產者生產完畢或者消費者讀取之後,各自進入等待狀態,等待下一次生產或者消費。
class info
public void setwebname(string webname)
public string getlink()
public void setlink(string link)
public synchronized void set( string webname, string link ) catch (exception e)
}this.setwebname(webname);
try catch (exception e) {}
this.setlink(link);
//生產完畢之後,將標誌位置false
flag = false;
super.notify();
}public synchronized void get() catch (exception e)
}try catch (exception e) {}
system.out.println(「消費:」 + this.getwebname() + "---->" + this.getlink());
//消費完畢之後,將flag置true;
flag = true;
super.notify();
}}
多執行緒之生產者消費者問題
生產者 producer 消費者consumer 籃子 basket stack 以棧結構代替的籃子,丟進去的饅頭滿足先進後出 問題描述 生產者生產10個饅頭丟進容量只有6的籃子裡面,消費者不斷吃掉籃子中的饅頭。package consumer producer public class consu...
多執行緒之生產者消費者問題
一 問題概述 是處理併發問題的乙個典型應用。生產者程序和消費者程序同時發生,以此修改快取區buffer的資源。二 模型思路 被管理的資源good,在快取區內 class goods 主程式,再去補充細節 public class testpc 分析下需要,實現思路是快取區類中放有貨物的陣列,生產者程...
多執行緒之經典生產者消費者問題
通過訊號量,wait,nofity,synchronized來解決生產者消費者問題。例項如下 package thread public class threadwaitandnotifytest class iphone catch interruptedexception e system.ou...