wait:会让出对象锁,同时,当前线程休眠,等待被唤醒,如果不被唤醒,就一直等在那儿。
notify:并不会让当前线程休眠,但会唤醒休眠的线程。
生产者和消费者案例
package XianCheng;
public class BaoZi {
String name;//包子名称
boolean flag;//包子的状态(true表示存在false表示不存在)
}
package XianCheng;
public class ChiHuo extends Thread{
BaoZi baozi;
//构造方法:用来指定线程的名字和要操作的资源
public ChiHuo(String name,BaoZi bz) {
super(name);
this.baozi = bz;
/**
* 对于吃货------消费者:
* 如果包子 不存在 进入等待状态
* 如果包子 存在 进入执行状态,吃包子。吃完之后包子变为不存在﹑此时唤醒早餐店制作包子
*/
}
public void run(){
String threadName=Thread.currentThread().getName();
int count=0;
while (true){
synchronized (baozi){
count++;
if (count>10){
break;
}
if (baozi.flag){//如果包子存在
System.out.println(threadName+"开始吃"+baozi.name) ;//吃包子
baozi.notify(); //唤醒同一资源下的其他线程
}else {//如果包子不存在
try {
baozi.wait();
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
}
}
}
package XianCheng;
public class ZaoCanDian extends Thread{
BaoZi baozi;
//构造方法:用来指定线程的名字和要操作的资源
public ZaoCanDian(String name, BaoZi bz) {
super(name);
this.baozi = bz;
/**
* 对于早餐店----生产者:
* 如果包子﹑不存在 ―进入执行状态,制造包子。制作完毕包子存在,唤醒吃货
* 如果包子 存在 进入等待状态
*/
}
public void run(){
String threadName=Thread.currentThread().getName();
int count=0;
while (true){
synchronized (baozi){
count++;
if (count>10){
break;
}
if (baozi.flag){//如果包子存在
try {
baozi.wait();
}catch (InterruptedException e){
e.printStackTrace();
}
}else {//如果包子不存在
System.out.println(threadName+"开始制作"+baozi.name) ;//制作包子
baozi.notify(); //唤醒同一资源下的其他线程
}
}
}
}
}
package XianCheng;
public class ThreadTest01 {
public static void main(String[] args) {
//定义资源对象
BaoZi baozi=new BaoZi();
baozi.name="韭菜鸡蛋";
baozi.flag=true;
//定义两个线程,起名字且操作同一个对象
ChiHuo ch=new ChiHuo("猪八戒" , baozi);
ZaoCanDian zcd=new ZaoCanDian("春光早餐", baozi);
//启动线程
zcd.start();
ch.start();
}
}