等待唤醒案例代码实现
package Text2;
public class demo6WaitAndNotify {
public static void main(String[] args) {
//创建锁对象,保证唯一
Object obj=new Object();
//创建一个顾客线程
new Thread(){
@Override
public void run() {
//保证等待和唤醒的线程只能有一个执行,需要使用同步技术
synchronized(obj) {
System.out.println("告诉老板要的包子的种类和个数");
//调用wait方法,放弃cpu的执行,进入waiting状态
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
//唤醒之后执行的代码
System.out.println("包子做好了,开吃!");
}
}
}.start();
//创建一个老板线程
new Thread(){
@Override
public void run() {
//花5秒做包子
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//保证等待和唤醒的线程只能有一个执行,需要使用同步技术
synchronized (obj){
System.out.println("做好后,告知顾客包子做好了");
//包子做好后,调用notify方法,唤醒顾客吃包子
obj.notify();
}
}
}.start();
}
}
Object类中wait带参数方法和notifyAll方法
package Text2;
public class demo6WaitAndNotify {
public static void main(String[] args) {
//创建锁对象,保证唯一
Object obj=new Object();
//创建一个顾客线程
new Thread(){
@Override
public void run() {
//保证等待和唤醒的线程只能有一个执行,需要使用同步技术
synchronized (obj) {
System.out.println("告诉老板要的包子的种类和个数");
//调用wait方法,放弃cpu的执行,进入waiting状态
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
//唤醒之后执行的代码
System.out.println("包子做好了,顾客1开吃!");
}
}
}.start();
new Thread(){
@Override
public void run() {
//保证等待和唤醒的线程只能有一个执行,需要使用同步技术
synchronized (obj) {
System.out.println("告诉老板要的包子的种类和个数");
//调用wait方法,放弃cpu的执行,进入waiting状态
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
//唤醒之后执行的代码
System.out.println("包子做好了,顾客2开吃!");
}
}
}.start();
//创建一个老板线程
new Thread(){
@Override
public void run() {
//花5秒做包子
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//保证等待和唤醒的线程只能有一个执行,需要使用同步技术
synchronized (obj){
System.out.println("做好后,告知顾客包子做好了");
//包子做好后,调用notify方法,唤醒顾客吃包子
obj.notifyAll();
}
}
}.start();
}
}
notifyAll()唤醒在此对象监视器上等待的所有线程
notify()唤醒在此对象监视器上等待的单个线程