阻塞阶段
让线程暂时休息,等到时机成熟再唤醒继续运行。
在对象执行wait方法的时候,线程必须拥有这个对象的monitor锁,然后释放锁,进入阻塞状态。
唤醒阶段
遇到中断
抛出异常,释放掉monitor。
作用:让线程只在预期的时间执行,其他时候不占用CPU资源。
不释放锁:
中断会抛出InterruptedException并清除中断状态。
TimeUnit.SECONDS.sleep()更加优雅。会忽略负参,而不是报错;有更多的API可以调用,例如SECONDS而不是只有ms。
面试题:
作用:因为新的线程加入,所以要等它执行完再执行(主等子)。
用法:main等待thread1执行完毕。(底层调用的是wait方法)
三个线程abc,怎么保证b在a后运行,c在b后运行(join)
中断
实际上是主线程阻塞时被中断。
在join期间,主线程是什么状态:Waiting
作用:释放线程的时间片,还是Runnable状态。
定位:JVM不保证遵循
yield和sleep区别:是否随时可能再次被调度