wait 是使得线程无限等待,notify是让线程运行,继续执行wait之后的代码
他们的使用的前提都是要使用锁对象,这样可以保证只有一个线程运行
代码
public class test1 {
public static void main(String[] args) {
Object obj=new Object();
new Thread() {
public void run() {
synchronized(obj){
System.out.println("告知老板需要那种包子和数量");
try {
obj.wait();
}catch(InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
new Thread() {
public void run() {
synchronized(obj) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("告知顾客已经做好包子了");
obj.notify();
}
}
}.start();
}
}
运行结果:
第二行运行结果是在5秒后才出现的,这样就可以很好的表示这两个的作用。记住他们的使用通常是结合了锁对象来使用
2、wait的第二种使用方式:
该方法跟sleep方法一样,但是现在wait方法里面带参数的已经被抛弃了
我们可以使用sleep来让线程休眠。
sleep(5000)是代表着让线程休眠5秒
3、notifyAll()是唤醒所有该锁对象
package people;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
public class test1 {
public static void main(String[] args) {
Object obj=new Object();
while(true) {
new Thread() {
public void run() {
synchronized(obj){
System.out.println("顾客1:告知老板需要那种包子和数量");
try {
obj.wait();
}catch(InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
new Thread() {
public void run() {
synchronized(obj){
System.out.println("顾客2:告知老板需要那种包子和数量");
try {
obj.wait();
}catch(InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
new Thread() {
public void run() {
synchronized(obj) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("告知顾客已经做好包子了");
obj.notifyAll();
}
}
}.start();
}
}
}
的线程,让线程继续执行。
区别notify:notify 是唤醒单个线程的,唤醒是同一个锁对象的,但是如果有多个的话,就会随机唤醒一个执行。