1.wait(毫秒)
不用唤醒等毫秒过去后自己醒来了
2.notify()
唤醒一个单线程
3.notifyAl()
唤醒多个线程
进入到TimeWaiting(记时等待)有两种方式
1.使用sleep(long m)方00法,在毫秒值结束之后,线程睡醒进入到Runnable/Blocked状态
2.使用wait(long m)方法如果在毫秒值结束之后,还没有被notify唤醒,就会自动醒来,相除睡醒进入到Runnable/Blocked状态
public class Demo01WaitAndNotify {
public static void main(String[] args) {
//创建锁对象,保证唯一
Object obj = new Object();
//创建一个顾客线程(消费者)
new Thread(){
@Override
public void run() {
while (true) {
//保证等待和唤醒的线程只能有一个执行,需要使用同步技术
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() {
while (true) {
//保证等待和唤醒的线程只能有一个执行,需要使用同步技术
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() {
while(true){
//花了5S做包子
try{
Thread.sleep(5000);
}catch(InterruptedException e){
e.printStackTrace();
}
//保证等待和唤醒的线程只能有一个执行,需要使用同步技术
synchronized(obj){
System.out.println("老板5秒钟之后做好了包子,告知顾客,可以吃包子");
//做好包子之后,调用notify方法,唤醒顾客吃包子
obj.notifyAll();
}
}
}
}.start();
}
}
/*
告知老板要的保证和种类和数量
老板5秒钟之后做好了包子,告知顾客,可以吃包子
包子已经做好了,开吃
告知老板要的保证和种类和数量
老板5秒钟之后做好了包子,告知顾客,可以吃包子
包子已经做好了,开吃
告知老板要的保证和种类和数量
*/
来源:CSDN
作者:小猪帕绮
链接:https://blog.csdn.net/weixin_43989380/article/details/103989416