生產者—消費者問題產生的條件
條件:生產者執行緒Pp和消費者執行緒Pc同步,各Pp(Pc)間互斥,
互斥:可以簡單理解為,某一公共資源不允許兩個及以上并發執行緒同時訪問,
同步:因并發執行緒各自的執行結果互為對方執行條件(直接制約),使各執行緒按一定速度執行的程序,
生產者:增加資源,超出最大容量時停止生產,直到小于最大容量再重新開始生產,
消費者:消耗資源,容量為空時停止消耗,直到有了資源再重新開始消耗,
synchronized關鍵字
簡單看一下,加物件鎖的方式
synchronized(MyClass.class){
}
這樣就給MyClass.class物件加上了一個物件鎖,
干嘛要加鎖? 我前面寫過,生產者-消費者問題產生的條件一個是同步一個是互斥,生產者消費者問題天然滿足同步條件,synchronized則為互斥提供條件,
Java代碼實作單生產單消費
思路:一個Goods類,創建Goods類串列goods;一個Producer類,一個Consumer類,串列最大空間設為10;空間為10時,Producer執行緒進入wait(),空間為0時,Consumer執行緒進入wait(),不管是生產還是消費,都要發送notify()訊息,
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
Main m = new Main();
List<Goods> goods = new ArrayList<>();
Thread p = new Thread(m.new Producer(goods));
Thread c = new Thread(m.new Consumer(goods));
p.start();
c.start();
}
class Goods {}
class Producer implements Runnable {
final int MAX_SIZE = 10;
private List<Goods> goods;
public Producer(List<Goods> goods) {
this.goods = goods;
}
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
if (MAX_SIZE == goods.size()) {
System.out.println("貨架已滿");
synchronized (goods) {
try {
goods.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} else {
Goods g = new Goods();
goods.add(g);
System.out.println("生產,貨架已有商品:" + goods.size());
synchronized (goods) {
goods.notify();
}
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class Consumer implements Runnable {
private List<Goods> goods;
public Consumer(List<Goods> goods) {
this.goods = goods;
}
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
if (goods.size() > 0) {
goods.remove(0);
System.out.println("消費,貨架還剩商品:" + goods.size());
synchronized (goods) {
goods.notify();
}
} else {
System.out.println("貨架已空");
synchronized (goods) {
try {
goods.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
try {
Thread.sleep(1200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
歡迎大家交流討論,有錯誤還望大家指出,一起進步鴨!vx:iwxid_dezforever66
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/195815.html
標籤:其他
上一篇:MAP基礎
