多執行緒之消費者生產者問題

2021-09-23 20:37:41 字數 2408 閱讀 4952

未經過處理的**如下

}這裡有兩個問題:

首先是對於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...