s-day06-线程等待唤醒的案例(生产者与消费者)
This commit is contained in:
@@ -0,0 +1,5 @@
|
|||||||
|
package com.inmind.wait_notify08;
|
||||||
|
//该类的作用记录当前是否有包子(就是用来进行线程间通信的)
|
||||||
|
public class BaoZi {
|
||||||
|
boolean flag = false;//没有
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
package com.inmind.wait_notify08;
|
||||||
|
|
||||||
|
public class BaoZiPu implements Runnable{
|
||||||
|
BaoZi baoZi;
|
||||||
|
|
||||||
|
//构造方法来对baozi属性赋值
|
||||||
|
public BaoZiPu(BaoZi baoZi) {
|
||||||
|
this.baoZi = baoZi;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
//如果有包子就等着,如果没有包子就做一个包子
|
||||||
|
while (true) {
|
||||||
|
//使用同步代码块解决线程安全问题
|
||||||
|
synchronized (baoZi){
|
||||||
|
if (baoZi.flag) {
|
||||||
|
//如果有包子就等着
|
||||||
|
try {
|
||||||
|
baoZi.wait();//让当前线程等待,释放锁对象
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
//如果没有包子就做一个包子
|
||||||
|
System.out.println("包子铺做了一个包子");
|
||||||
|
baoZi.flag = true;
|
||||||
|
baoZi.notify();//唤醒顾客线程,通知包子做好了
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
package com.inmind.wait_notify08;
|
||||||
|
|
||||||
|
public class GuKe implements Runnable{
|
||||||
|
BaoZi baoZi;
|
||||||
|
public GuKe(BaoZi baoZi) {
|
||||||
|
this.baoZi = baoZi;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
//如果有包子就吃,如果没有包子就等待
|
||||||
|
while (true) {
|
||||||
|
synchronized (baoZi){
|
||||||
|
if (baoZi.flag) {
|
||||||
|
//如果有包子就吃
|
||||||
|
System.out.println("顾客吃了一个包子");
|
||||||
|
baoZi.flag = false;
|
||||||
|
baoZi.notify();//唤醒包子铺,让包子铺继续做包子
|
||||||
|
}else {
|
||||||
|
try {
|
||||||
|
baoZi.wait();//让当前线程等待,释放锁对象
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
package com.inmind.wait_notify08;
|
||||||
|
//实现等待唤醒案例(生产者与消费者)
|
||||||
|
public class Test10 {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
//1.创建包子对象(用来线程间共享,线程间通讯)
|
||||||
|
BaoZi baoZi = new BaoZi();
|
||||||
|
baoZi.flag = true;
|
||||||
|
//2.创建2个线程任务对象
|
||||||
|
BaoZiPu baoZiPu = new BaoZiPu(baoZi);
|
||||||
|
GuKe guKe = new GuKe(baoZi);
|
||||||
|
//3.创建线程,启动线程
|
||||||
|
new Thread(baoZiPu).start();
|
||||||
|
new Thread(guKe).start();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user