生產者與消費者案例

2021-08-28 05:48:33 字數 1477 閱讀 9318

手頭有兩個人(也就是兩個類),乙個做存操作,乙個做取操作,並且只有當存完或者取完方可進行令乙個操作。以此達到迴圈輸出的訪問操作。

第一步:先寫測試生產者類與消費者類  和 執行緒操作msg類

//生產者

public class product implements runnable

@override

public void run()catchelse}}

}}//消費者

public class consumer implements runnable

@override

public void run()catch}}

}//執行緒操作msg類

public class msg

this.title = title;

this.content = content;

this.flag = false;//存完成,改變標識

system.out.println(thread.currentthread.getnmae() + "睡眠,並喚醒睡眠或者等待的執行緒")

super.notify();//喚醒第乙個等待的執行緒(取)

}public synchrnoized void get()

system.out.println(thread.currentthread().getname() + this.title +"-----" + this.content)

this.flag = false;//存完成,改變標識

super.notify();//喚醒第乙個等待的執行緒(存)

}public static void main(string args)

}/**

*實際上這個也很好理解,假設有兩個執行緒,存執行緒和取執行緒(兩個不同的操作類)被cpu呼叫,進入佇列,假

*設存執行緒先被執行**那麼,先走for迴圈第次存(同步,別的執行緒進不來)胡明明,當準備走第1次時,再次進

*行存的操作,發現存不了了,因為要存一次取一次,故將該執行緒進入睡眠狀態,也就數阻塞。所以在外面伺機*已久的取執行緒進來了,進行取得操作,並喚醒其它睡眠或者等待的執行緒(期間存執行緒可能已經被喚醒了,進行*了存的操作)。當再次準備繼續走迴圈時,同樣跟存一樣,也是必須一取一存才可以,由於識別符號的改變,故*取執行緒進入睡眠。以此類推

*/

//當只有訪問執行緒的時候確實是交易輸出,但是我加了乙個存執行緒,進入死鎖。解析如下:

假設存1存2執行緒分別進入run方法,但是只能有乙個人才能做存操作,假設有幸是存1,那麼存1存完後,存方法被放開了,存1存2都有可能再次做存操作,但是,不管誰做存都做不了,要等到取做完才能做存,即會有兩個存執行緒進入等待狀態,隨後只有當取執行緒喚醒其中乙個執行緒後才能進行存的操作,那麼它又將喚醒乙個執行緒,那麼到底是喚醒存1還是存2呢?先不管,假設喚醒了存1,那存1又該喚醒誰呢?如果喚醒的是存2呢?那麼取執行緒也就只能睡著,即下乙個存執行緒無法解放,兩個存執行緒就只能一直等待著,三個進入死鎖。

生產者消費者 生產者與消費者模式

一 什麼是生產者與消費者模式 其實生產者與消費者模式就是乙個多執行緒併發協作的模式,在這個模式中呢,一部分執行緒被用於去生產資料,另一部分執行緒去處理資料,於是便有了形象的生產者與消費者了。而為了更好的優化生產者與消費者的關係,便設立乙個緩衝區,也就相當於乙個資料倉儲,當生產者生產資料時鎖住倉庫,不...

生產者和消費者案例

public final void wait throws interruptedexception 丟擲 illegalmonitorstateexception 如果當前執行緒不是此物件監視器的所有者。interruptedexception 如果在當前執行緒等待通知之前或者正在等待通知時,任何...

生產者 消費者案例(1)

多執行緒開發中經典的案例。生產者 消費者案例 package com.xiaofeng.example 生產者 消費者案例 author xiaofeng1015 public class theaddemo5 class producter implements runnable override...