LockSupport提供park()和unpark()方法实现线程阻塞和唤醒。底层实现是经过sun.misc.Unsafe的park和unpark。线程
关于sun.misc.Unsafe的说明请参见个人另一篇博客。对象
核心就是经过一个信号量(permit)实现的,0阻塞,1继续执行。博客
park时能够指定blocker以及阻塞时长或者阻塞到什么时间点,经过UNSAFE.park第一个boolean参数决定,true指定时间,false指定时长。it
能够先执行unpark,再执行part的时候发现以前unpark设置为1了,直接继续执行,并设置信号量为0。io
park时除了unpark或者时间到了的状况外,阻塞的线程也会被其余线程调用该线程的interrupt方法中断并当即返回,thread
该过程不会抛出异常,因此调用者须要检查线程状态,是怎样的方式被唤醒的。sed
park的注释说明以下:方法
This method does <em>not</em> report which of these caused the
method to return. Callers should re-check the conditions which caused
the thread to park in the first place.异常
与wait的区别:注释
wait须要获取对象锁,LockSupport不须要;
wait挂起的是当前线程,属于随机性,唤醒notify,notifyAll也是随机的,LockSupport直接控制的是线程,指定线程park,指定线程unpark或interrupt