如图:
主要讲的是Object类中的wait()和notify()方法,要想使用这两个方法必须创建Object对象通过对象来调用方法,wait方法执行用锁对象锁住当前线程等待运行 notify方法表示解锁调用自己的对象,
wait方法一旦执行 后面的代码直接停止 就算有notify的也无法执行 需要等待另一个线程来进行解锁
import java.util.Objects;
public class FuXi2 {
public static void main(String[] args) {
Object o = new Object();//创建锁对象o,多个多线程之间可以用来互相唤醒对方的对象,前提多线程使用同一个锁对象并run方法已经有wait方法执行 锁对象.notify();使等待状态线程执行
new Thread() {
@Override
public void run() {
synchronized (o) {//同步代码将可能出现线程安全问题的代码写在里面 因为o.notify();o.wait();存在多线程之间互相访问(同一个资源)
System.out.println("老板:请问顾客要什么包子");
try {//1.问完顾客之后进行等待 切换到顾客线程等待顾客回答释放锁
o.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
try {//3.被顾客线程唤醒.notify();继续执行
Thread.sleep(5000);//3.等待5秒钟(装包子中)
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("老板:包子已经做好了");//3.回答顾客
try {
o.notify();//3.解锁顾客线程锁
o.wait();//3.自己进行等待 等客户回复
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("老板:可草泥马楼");
}
}
}.start();
new Thread() {
@Override
public void run() {
synchronized (o) {
try {//2.犹豫3秒钟 3000毫秒==秒
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("顾客:来几个热门包子");//2.回答老板
o.notify();//解锁老板线程
try {
o.wait();//2.自己进行等待状态等待老板回复
} catch (InterruptedException e) {
e.printStackTrace();
}
try {//4./犹豫3秒钟
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("顾客:好的草泥马");//4.骂了老板
o.notify();//4.解锁老板线程锁
}
}
}.start();
}
}