執行緒通訊的經典案例 生產者和消費者

2021-08-20 18:29:53 字數 2511 閱讀 5558

本程式的核心結構如下:首先定義兩個類:乙個生產者執行緒,另乙個消費者執行緒類,生產者每生產完乙個資料之後,消費者要取走這些資料。

現在的資料有兩種:

title=小動物,content=草泥馬。

title=小金子,content=不是好孩子

範例:**基本模型

package thread;

class message

public void settitle(string title)

public string getcontent()

public void setcontent(string content)

}class productor implements runnable

@override

public void run() catch (interruptedexception e)

this.msg.setcontent("草泥馬");

}else catch (interruptedexception e)

this.msg.setcontent("不是好孩子");}}

}}class customer implements runnable

@override

public void run() catch (interruptedexception e)

system.out.println(this.msg.gettitle()+","+this.msg.getcontent());}}

}public class threadh

}這個時候出現了兩個問題:

資料錯位:

資料重複取出與重複設定:

解決資料錯位問題

要想解決資料錯位,使用同步處理即可

package thread;

class message catch (interruptedexception e)

this.content=content;

}public synchronized void get() catch (interruptedexception e)

system.out.println(this.title+","+this.content);}}

class productor implements runnable

@override

public void run()

else }}

}class customer implements runnable

@override

public void run() }}

public class threadh

}解決了資料的錯位,但是重複的操作更嚴重了

解決資料重複操作:

要想解決重複的操作必須加入等待與喚醒機制。而這樣的處理機制是由object類提供的方法支援,在object類之中有如下的三個方法使用;

等待:public final void wait() throws interruptedexception;

第一次喚醒:public final void notify();

喚醒全部:public final void notifyall();誰的優先順序高救先執行

範例:解決問題

package thread;

class message catch (interruptedexception e)

}this.title=title;

try catch (interruptedexception e)

this.content=content;

this.flag=false;

super.notify();

}public synchronized void get() catch (interruptedexception e)

}try catch (interruptedexception e)

system.out.println(this.title+","+this.content);

this.flag=true;

super.notify();}}

class productor implements runnable

@override

public void run()

else }}

}class customer implements runnable

@override

public void run() }}

public class threadh

}面試題:請解釋sleep()和wait()的區別?

sleep()是thread類定義的方法,在休眠之後可以自動喚醒。

wait()是object類定義的方法,等待之後必須使用notify()或notifyall()手工喚醒

總結:1.多執行緒的兩種實現方式及區別,

2.同步的概念要清楚

3.知道object類的三個執行緒操作方法的作用

執行緒經典案例 (生產者和消費者)

假設現在有這樣的乙個情況,生產者生產乙個物品的同時要讓消費者取走。生產者要將自己生產的乙個產品交到乙個公共的區域 超市 讓消費者去取走 購買 所以這個時候我們要考慮到執行緒同步和執行緒重複取值的乙個問題。同步 synchronized,重複取值 設定乙個標記值,當達到條件時執行,未滿足條件時等待 c...

經典案例 生產者和消費者

生產者與消費者問題是多執行緒同步的乙個經典問題。生產者和消費者同時使用一塊緩衝區,生產者生產商品放入緩衝區,消費者從緩衝區中取出商品。我們需要保證的是,當緩衝區滿時,生產者不可生產商品 當緩衝區為空時,消費者不可取出商品。wait 與notify 方法 lock與condition機制 blocki...

多執行緒系列之執行緒通訊(生產者和消費者案例)

1,一般用object的wait notify notifyall,讓執行緒等待和喚醒實現執行緒之間的通訊,而且上述方法只能由同步監聽物件 共享資源 來呼叫,否則會報illegalmonitorstateexception異常。2,還可以通過reentranlock,使用condition的awai...