-
wait(long timeout)让当前线程处于“等待(阻塞)状态”,“直到其他线程调用此对象的notify()方法或 notifyAll() 方法,或者超过指定的时间量”,当前线程被唤醒(进入“就绪状态”)。
-
总结 wait() 的工作过程就是:
-
释放对象锁(所以必须有一个锁才能正常执行)
-
等待通知(时间可能会长, 因为不参与后序锁的竞争直到有其他线程调用该对象的notify()去唤醒该线程)
-
收到通知后 尝试重新获取对象锁 继续往下执行
- ==特别注意: ==
-
wait() 和 notify() 操作必须放在 synchronized 的代码块之内使用 否则会报异常
-
调用wait() 和 notify() 的对象必须是同一个对象 才能起到等待和唤醒操作 更准确的说 因为wait 和 notify要在 synchronized的代码块内 所以上锁饿对象也应该和wait() 和 notify() 的对象必须是同一个对象 这样就是4个对象得保持一致
=======================================================================
- 其实wait()方法就是使线程停止运行。
-
方法wait()的作用是使当前执行代码的线程进行等待,wait()方法是Object类的方法,该方法是用来将当前线程置入“预执行队列”中,并且在wait()所在的代码处停止执行,直到接到通知或被中断为止。
-
wait()方法只能在同步方法中或同步块中调用。如果调用wait()时,没有持有适当的锁,会抛出异常。
-
wait()方法执行后,当前线程释放锁,并一直处于等待通知状态, 直到其他线程唤醒该线程后与其它线程竞争重新获取锁。
public class ThreadTest2 {
public static void main(String[] args) {
Object locker = new Object();
Thread t = new Thread() {
@Override
public void run() {
synchronized (locker) {
System.out.println(“t 开始运行”);
try {
locker.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(" t 运行结束");
}
}
};
t.start();
}
}

=========================================================================
-
一个线程执行到object.wait()之后就一直等待下去,那么程序肯定不能一直这么等待下去了。这个时候就需要使用到了另外一个方法唤醒的方法notify()。
-
notify方法就是使停止的线程继续运行。
-
方法notify()也要在同步方法或同步块中调用,该方法是用来通知那些可能等待该对象的对象锁的其它线程,对其发出通知notify,并使它们重新获取该对象的对象锁。如果有多个线程等待,则有线程规划器随机挑选出一个呈wait状态的线程。
-
在notify()方法后,当前线程不会马上释放该对象锁,要等到执行notify()方法的线程将程序执行完,也就是退出同步代码块之后才会释放对象锁。
public class ThreadTest3 {
public static void main(String[] args) {
Object locker = new Object();
Thread t = new Thread() {
@Override
public void run() {
synchronized (locker) {
System.out.println(" t 开始运行");
try {
locker.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(" t 运行结束");
}
}
};
t.start();
Thread t1 = new Thread() {
@Override
public void run() {
synchronized (locker) {
System.out.println(" t1 开始运行");
locker.notify();
System.out.println(" t1 运行结束");
}
}
};
t1.start();
Thread t2 = new Thread() {
@Override
public void run() {
synchronized (locker) {
System.out.println(" t2 开始运行");
先自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。



由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以扫码领取!
总结
如果你选择了IT行业并坚定的走下去,这个方向肯定是没有一丝问题的,这是个高薪行业,但是高薪是凭自己的努力学习获取来的,这次我把P8大佬用过的一些学习笔记(pdf)都整理在本文中了
《Java中高级核心知识全面解析》

小米商场项目实战,别再担心面试没有实战项目:

并坚定的走下去,这个方向肯定是没有一丝问题的,这是个高薪行业,但是高薪是凭自己的努力学习获取来的,这次我把P8大佬用过的一些学习笔记(pdf)都整理在本文中了
《Java中高级核心知识全面解析》
[外链图片转存中…(img-2exR677F-1711376608618)]
小米商场项目实战,别再担心面试没有实战项目:
[外链图片转存中…(img-i9Jwpa7P-1711376608619)]
需要更多Java资料的小伙伴可以帮忙点赞+关注,点击传送门,即可免费领取!
文章详细解释了Java中wait()和notify()方法的工作原理,强调了它们在多线程同步中的作用,以及如何确保在synchronized代码块中的正确使用。
374

被折叠的 条评论
为什么被折叠?



