一.wait,notify与join的区别
1.wait(),notify()是Object类中的方法
join()是Thread类中的方法
2.wait,notify针对的是同等级的线程(不相干)
join针对的是主线程与子线程(相干)
比如:
家里要做饭,没有米了,我去米店买米。
家里做饭是主线程,必须要等待我去买米(子线程)回来再开始。这就是join,必须等待子线程的结果。子线程是主线程的一部分。
而我去米店买米(一个线程),可能老板没米了(wait),他去进货(另一个线程),进来货了,通知我(notify),这就是两个不相干的线程间的等待。
二.使用方法
因为是Object类中的方法,所以要创建一个Object对象作为锁对象,然后创建两个线程,一个用于wait,一个用于notify,(一定要针对同一个锁对象)
import java.util.concurrent.TimeUnit;
public class Demo_waitNotify {
public static void main(String[] args) {
//创建一个锁对象
Object locker = new Object();
//线程1 演示wait()方法
Thread t1 = new Thread(() -> {
while (true) {
System.out.println("wait启动前...");
synchronized (locker) {
try {
locker.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("wait唤醒后...");
System.out.println("==================");
}
}
});
Thread t2 = new Thread(() -> {
while (true) {
System.out.println("唤醒之前...");
synchronized (locker) {
locker.notifyAll();
}
System.out.println("唤醒之后...");
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
//启动线程
t1.start();
t2.start();
}
}
可以观察到 wait,notify这两个方法的作用就是安排线程中的执行顺序。
三.注意事项:
wait,notify这两个方法必须搭配synchronized使用,而且必须使用同一个锁对象
还有就是,当一个线程走到wait时,并不会一直持有着锁浪费资源,而是会释放锁,一起加入到阻塞等待的队列中
当另一个线程notify后,相当与大喊一声“准备好了,行动吧!”。唤醒指定线程或notifyAll唤醒该对象的所有线程来竞争。