目录
🌟1、wait()
🌟2、notify()
🌟1、wait()
(1)wait()方法与notify()方法都是Object类中的方法。
(2)wait()是让线程等待一段时间,死等——>状态WAITING:没有时间限制的等待.
(3)wait(long) 是让线程等待一段时间,过时不候。在一定时间内不会被调度到CPU中——>TIMED_WAITING:有时间限制的等待。
wait()必须与关键字synchronized联合使用,否则会报错。
❓ 问题1:区分wait()与join()
(1)wait()是Obejct类中的方法,join()是Thread类中的方法;
(2) join()是让调用方去等待,wait()是让执行方去等待。
🌰导师告诉班长,现在要去辅导员办公室取一份资料回来签字。班长过去了🧑,发现学院里所有的班长都来了,资料不过,现在还在打印中,让大家全部都等待一会。😫这个班长等待的过程其实就是执行方等待。等到所有的资料都打印完毕,辅导员这时候喊一声:所有的班长都过来,这就是notifyAll(),唤醒了所有的线程;如果是只喊了一个:一班的班长来一下,那就是notify(),只唤醒了一个线程,其他的线程还在等待。等到班长终于拿好资料回去找导师的时候,导师在这期间等待的过程就是一个调用方等待。你理解了吗~😆
❓ 问题2:区分wait()与sleep()
(1)wait与sleep是完全没有可比性的🤣一个是用于线程之间的通信,另一个是让线程阻塞等待的。不过都是可以让线程放弃执行一段时间;sleep可以写在程序的任何位置。
(2) wait()是Object类中的方法,sleep()是Thread类中定义的方法;
(3) wait()必须要和synchronized关键字搭配使用,调用之后会释放锁;sleep()只是让线程进入休眠状态,和锁毫无关系。
🌟2、notify()
notify(): 只唤醒等待中的一个线程,并直接参与锁竞争;
notifyAll:() : 一次性唤醒等待中的所有线程,线程共同去参与锁竞争。
🌰 wait与notify必须是同一个锁对象,wait必须与synchronized搭配使用。 wait与notify被调用后,当前线程都会释放锁资源。
private static Object locker = new Object();
public static void main(String[] args) {
Thread t1 = new Thread(()->{
while (true){
System.out.println("t1在等待之前");
try {
synchronized (locker) {
locker.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("t1在等待之后");
System.out.println("=============================");
}
});
t1.start();
Thread t2 = new Thread(()->{
while (true){
System.out.println("t2唤醒之前");
//唤醒时也要使用同一个锁对象
synchronized (locker) {
locker.notify();
}
System.out.println("t2唤醒之后");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t2.start();
}
控制台输出:
中午继续努力~