等待与通知、挂起与继续执行、等待线程结束和谦让
等待与通知、挂起与继续执行、等待线程结束和谦让🐻
一.等待(wait)和通知(notify)🐷
1.wait()和notify()是输出Object类中的方法,这意味着任何对象都可以调用这两个方法
2.方法签名
public final void wait() throws InterruptedException
public final native void notify()
比如,当在一个对象实例obj上调用wait()方法后,当前线程就会在这个对象上等待,直到其他线程调用obj.notify()方法为止,这时obj对象就成为多个线程间的有效通信手段
3.①wait()
如果一个线程调用了Obect.wait(),那么它就会进入object对象的等待队列,这个等待队列,可能有多个线程,因为系统运行多个线程同时等待某一个对象
②notify(),随机唤醒一个(完全随机),不公平的选择
③notifyAll(),全部唤醒
4.Object.wait()方法必须包含在对于的synchronzied语句中,无论是wait()或者notify()都需要首先获得目标对象的一个监视器
5.Object.wait()和Thread.sleep()方法都可以让线程等待若干时间,区别是wait()方法会释放目标对象的锁,而Thread.sleep()方法不会释放任何资源
二.挂起(suspend)和继续执行(resume)线程🐽
1.挂起的线程必须要等到resume()操作后,才能继续指定。
2.它们是废弃方法,不推荐使用。原因是suspend()在导致线程暂停的同时并不会去释放任何资源,此时,其他任何线程想要访问被它暂用的锁时,都会无法正常运行,直到resume()操作。如果resume()操作意外地在suspend()前就执行了,那么被挂起的线程可能很难有机会继续执行,而且它会占用着锁不释放,导致整个系统工作不正常
三.等待线程结束(join)和谦让(yield)🐖
1.join(),join 线程A,会阻塞(Blocked)线程B,直到线程A结束生命周期或者达到给定的时间
public final void join() throws InterruptedException
public final synchronized void join(long millis,int nanos) throws InterruptedException
public final synchronized void join(long millis) throws InterruptedException
2.yeild()方法属于一种启发式(hint)的方法,其会提醒调度器我愿意放弃当前的CPU资源,如果CPU资源不紧张,则会忽略这种提醒,线程会从RUNING状态切换到RUNNABLE状态,一般这个方法不太常用
3.yeild()和sleep()区别,1.5以前yeild()事实上调用了sleep()
①sleep会导致当前线程暂停指定的时间,没有CPU时间片的消耗
②yeild只是对CPU调度器的一个提示,如果CPU调度器没有忽略提示,它会导致线程上下文的切换
③sleep会使线程短暂block,会在给定的时间内释放CPU资源
④yeild会使RUNNING状态的Thread进入RUNNABLE状态(如果CPU调度器没有忽略这个提示的话)
⑤sleep几乎百分百给定时间的休眠,而yield的提示并不能一定担保
⑥一个线程sleep另一个线程调用interrupt会捕获到中断信号,而yield则不会