問題:乙個倉庫最多容納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 分析下需要,實現思路是快取區類中放有貨物的陣列,生產者程...