LockSupport概述
LockSupport工具类定义了一组公共的静态方法,提供了最基本的线程阻塞和唤醒功能,是创建锁和其他同步类的基础,你会发现,AQS中阻塞线程和唤醒线程的地方,就是使用LockSupport提供的park和unpark方法,比如下面这段:
// 挂起线程
private final boolean parkAndCheckInterrupt() {
LockSupport.park(this);
return Thread.interrupted();
}
// 唤醒线程
private void unparkSuccessor(Node node) {
//...
if (s != null)
LockSupport.unpark(s.thread);
}
park与unpark相关方法
LockSupport提供了一组park开头的方法来阻塞当前线程【省略static】:
void park():阻塞当前线程,如果调用unpark(Thread thread)方法或者当前线程被中断,才能从park()方法返回。
void parkNanos(long nanos):阻塞当前线程,最长不超过nanos纳秒,返回条件在park()的基础上增加了超时返回。
void parkUntil(long deadline):阻塞当前线程,直到deadline【从1970年开始到deadline时间的毫秒数】时间。
void unpark(Thread thread):唤醒处于阻塞状态的线程thread。
JDK1.6中,增加了带有blocker参数的几个方法,blocker参数用来标识当前线程在等待的对象,用于问题排查和系统监控。
下面演示park()方法和unpark()方法的使用:
在thread线程中调用park()方法,默认情况下该线程是不持有许可证的,因此将会被阻塞挂起。 unpark(thread)方法将会让thread线程获得许可证,才能从park()方法返回。
public static void main(String[] args) throws InterruptedException