锁对象 调用wait方法使线程等待 调用notify方法唤醒进程
注: 两证方法只能使用锁对象调用
package demo3_WaitAndNotify;
//顾客和老板线程必须使用同步代码块包裹起来 保证线程和唤醒只能有一个在执行
//同步使用的锁对象必须保证唯一
//只有锁对象才能调用wait和 notify方法
public class demo01_WN {
public static void main(String[] args) {
Object obj=new Object();
new Thread(){
@Override
public void run() {
synchronized (obj){
System.out.println("告知老板包子的种类和数量");
//调用wait方法
try{
obj.wait();
}catch (InterruptedException e){
e.printStackTrace();
}
//被唤醒之后 执行的代码
System.out.println("吃包子");
}
}
}.start();
new Thread(){
@Override
public void run() {
try {
Thread.sleep(5000);
}catch (InterruptedException e){
e.printStackTrace();
}
synchronized (obj){
System.out.println("老板五秒钟做好包子,告知顾客可以吃包子了");
obj.notify();
}
}
}.start();
}
}
package demo3_WaitAndNotify;
/*
* 进入TimeWaiting(计时等待)有两种方式
* 1,sleep(long m)方法 在毫秒值结束之后 线程睡醒进入Runable/Blocked状态
* 2,使用wait(long m)方法 wait方法如果在毫秒值结束之后 还没有被notify唤醒 就会自动醒来 线程睡醒进入到Runanle/Blocked状态
* 3.notify() 随机唤醒一个线程 唤醒全部线程*/
public class demo02_WN {
public static void main(String[] args) {
Object obj=new Object();
new Thread(){
@Override
public void run() {
synchronized (obj){
System.out.println("告知老板包子的种类和数量");
//调用wait方法
try{
obj.wait(5000);
}catch (InterruptedException e){
e.printStackTrace();
}
//被唤醒之后 执行的代码
System.out.println("吃包子");
}
}
}.start();
new Thread(){
@Override
public void run() {
synchronized (obj){
System.out.println("告知老板包子的种类和数量");
//调用wait方法
try{
obj.wait(5000);
}catch (InterruptedException e){
e.printStackTrace();
}
//被唤醒之后 执行的代码
System.out.println("吃包子");
}
}
}.start();
new Thread(){
@Override
public void run() {
try {
Thread.sleep(5000);
}catch (InterruptedException e){
e.printStackTrace();
}
synchronized (obj){
System.out.println("老板五秒钟做好包子,告知顾客可以吃包子了");
obj.notifyAll();
}
}
}.start();
}
}