(1)主函數
/**
* 生產者消費者模式:
* 生產者判斷state是否爲true,若爲true則表示有包子,生產者休眠,等待消費者拿到true的狀態進行消費;
* 若不爲true說明現在沒有包子,則生產包子,並將狀態置爲true,之後,將消費者喚醒。
* 消費者判斷狀態是否爲false,若爲false則說明沒有包子,消費者睡眠,等待生產者拿到false的狀態開始生產;
* 若不爲false則說明有包子,消費者進行消費,並將狀態置位false,之後將生產者喚醒。
*/
public class BaoZiDemo {
public static void main(String[] args) {
BaoZI baoZI = new BaoZI();
Product product = new Product(baoZI);
Consumer consumer = new Consumer(baoZI);
new Thread(product).start();//生產者線程
new Thread(consumer).start();//消費者線程
}
}
(2)包子對象
public class BaoZI {
private String pi;
private String xian;
private boolean state=false;
public BaoZI() {
}
public BaoZI(String pi, String xian, boolean state) {
this.pi = pi;
this.xian = xian;
this.state = state;
}
public String getPi() {
return pi;
}
public void setPi(String pi) {
this.pi = pi;
}
public String getXian() {
return xian;
}
public void setXian(String xian) {
this.xian = xian;
}
public boolean getState() {
return state;
}
public void setState(boolean state) {
this.state = state;
}
}
(3)生產者線程實現類
public class Product implements Runnable {
private BaoZI bz;//鎖對象,控制同步代碼塊
public Product(BaoZI bz) {
this.bz = bz;
}
@Override
public void run() {
while (true){
synchronized (bz){
if(bz.getState()){//爲true表示現在有包子
try {
bz.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("生產一個包子");
bz.setState(true);
bz.notify();
}
}
}
}
}
(4)消費者線程實現類
public class Consumer implements Runnable {
private BaoZI bz;//鎖對象,控制同步代碼塊
public Consumer(BaoZI bz) {
this.bz = bz;
}
@Override
public void run() {
while(true){
synchronized (bz){
if(!bz.getState()){//狀態爲false,表示沒有包子
try {
bz.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
System.out.println("消費者使用包子");
bz.setState(false);
bz.notify();
}
}
}
}
}