多執行緒之生產消費問題

2021-06-22 05:30:19 字數 1678 閱讀 1162

問題:乙個倉庫最多容納6個產品,製造商現在要製造20件產品存入倉庫,消費者要從倉庫取出20件產品來消費,製造商生產產品和消費者消費產品的速度很可能不一樣!

/**

* 定義倉庫

* @author liao

*/class syncstack catch (exception e)

} /*通知正在等待的執行緒進入就緒狀態(可能不會立即執行),即使沒有執行緒在等待也不會報錯,所以一定要加上這句,否則正在等待的執行緒可能會陷入阻塞*/

this.notify();

/*把產品出入倉庫*/

data[cnt] = ch;

/*陣列下標加一*/

cnt ++;

system.out.printf("生產了: %c\n", ch);

system.out.printf("容器中現在共有%d個字元!\n\n", cnt); }

/*** 消費者從倉庫中取出產品

* 這裡也要使用執行緒同步

* 執行pop()方法的時候就不能執行push()方法

* @throws

*/public synchronized char pop() catch (exception e)

} /*通知正在等待的執行緒進入就緒狀態(可能不會立即執行),即使沒有執行緒在等待也是不會報錯的,所以一定要加上這句,否則正在等待的執行緒可能會陷入阻塞*/

this.notify();

/*取出最上面的產品*/

ch = data[cnt - 1];

/*陣列的下標要減去1*/

cnt --;

system.out.printf("取出: %c\n", ch);

system.out.printf("容器中現在共有%d個字元!\n\n", cnt);

return ch; }}

/** * 定義生產者

* @author liao

*/class producer implements runnable

/*** 生產操作

*/public void run() }}

/** * 定義消費者

* @author liao

*/class consumer implements runnable

/*消費者消費產品*/

public void run() catch (interruptedexception e)

} } }

/** * 測試類

* @author liao

* */

public class producerconsumertest

}

總結:1:a.wait():將執行a.wait()的執行緒進入阻塞狀態,讓出cpu的控制權,釋放對a的鎖定。

2:a.notify():叫醒正在等待的執行緒,使其進入就緒狀態,需要注意的是,此時即使沒有執行緒在等待,呼叫這個方法也是不會出錯的。

3:a.notifyall():叫醒其他所有因為執行了wait()而陷入阻塞的執行緒。

4:不能使用sleep(***),和設定優先順序來控制哪乙個執行緒先執行,因為這些都不能是執行緒立即進入執行狀態,而是進入就緒狀態。

注:notify()和notifyall()不是叫醒呼叫他們的當前執行緒,而是叫醒其他因為呼叫wait()而陷入阻塞的執行緒。

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

生產者 producer 消費者consumer 籃子 basket stack 以棧結構代替的籃子,丟進去的饅頭滿足先進後出 問題描述 生產者生產10個饅頭丟進容量只有6的籃子裡面,消費者不斷吃掉籃子中的饅頭。package consumer producer public class consu...

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

未經過處理的 如下 這裡有兩個問題 首先是對於info物件,生產者可能只新增了webname的資訊,而沒有來得及新增link資訊,程式就切換到了消費者執行緒,消費者執行緒將webname和上乙個info物件的link聯絡到一起。生產者存放了若干次的資料,消費者才開始讀取資料,或者是消費者取完乙個資料...

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

一 問題概述 是處理併發問題的乙個典型應用。生產者程序和消費者程序同時發生,以此修改快取區buffer的資源。二 模型思路 被管理的資源good,在快取區內 class goods 主程式,再去補充細節 public class testpc 分析下需要,實現思路是快取區類中放有貨物的陣列,生產者程...