3种方式让线程进入休眠状态,分别是Thread.sleep()、Object.wait()、LockSupport.park()方法
Thread.sleep
1、Thread.sleep(time)方法必须传入指定的时间线程将进入休眠状态
2、会抛出InterruptedException异常,这是受检查异常,调用者必须处理
3、通过sleep方法进入休眠的线程不会释放持有的锁
wait
1、wait可指定睡眠时间,也可以无限制的休眠,直到有人唤醒他。
2、必须获得对象上的锁后,才可以执行该对象的wait方法。否则程序会在运行时抛出IllegalMonitorStateException异常。
3、调用wait()方法后,线程进入休眠的同时,会释放持有的该对象的锁,这样其他线程就能在这期间获取到锁了
4、notify()或者notifyAll()方法可以唤醒因为wait()而进入等待的线程,但不能指定唤醒哪一个线程,只能随机的返回一个线程
5、wait 和notify有使用限制,必须在schronized的同步块里面
LockSupport.park
1、底层调用了Unsafe类的park方法:
2、调用park设置一个blocker对象,主要用来给监视工具和诊断工具确定线程受阻塞的原因。
3、park进入休眠后并不会释放持有的锁
4、park方法不会抛出InterruptedException,但是它也会响应中断。当外部线程对阻塞线程调用interrupt方法时,park阻塞的线程也会立刻返回。
5、park和unpark可以唤醒指定的线程。