(一)、LockSupport概述
我们在前面分析ReentrantLock以及Condition通信机制的时候多次使用到LockSupport.park()以及LockSupport.unpark()方法。LockSupport是用来阻塞线程的工具,park()方法用来阻塞线程,unpark()方法用来唤醒线程。
LockSupport是不支持重入的,每一条线程都会对应一个许可,如果这个许可可用,调用park()方法就不会发生阻塞。但是如果不可用,调用park()方法就会发生线程阻塞,这时就可以使用unpark()方法来获取许可。
(二)、LockSupport常用方法
方法 | 功能 |
---|---|
void park() | 阻塞当前线程,如果调用unpark方法或者当前线程被中断,从能从park()方法中返回 |
void park(Object blocker) | 功能同方法1,入参增加一个Object对象,用来记录导致线程阻塞的阻塞对象,方便进行问题排查 |
void parkNanos(long nanos) | 阻塞当前线程,最长不超过nanos纳秒,增加了超时返回的特性 |
void parkNanos(Object blocker, long nanos) | 功能同方法3,入参增加一个Object对象,用来记录导致线程阻塞的阻塞对象,方便进行问题排查 |
void parkUntil(long deadline) | 阻塞当前线程,知道deadline |
void parkUntil(Object blocker, long deadline) | 功能同方法5,入参增加一个Object对象,用来记录导致线程阻塞的阻塞对象,方便进行问题排查 |
void unpark(Thread thread) | 唤醒处于阻塞状态的指定线程 |
(三)、LockSupport使用方法
public static void main(String[] args) {
//线程1
Thread thread1 = new Thread() {
@Override
public void run() {
System.out.println("执行park方法前");
LockSupport.park();
System.out.println("执行park方法后");
}
};
//线程2
Thread thread2 = new Thread() {
@Override
public void run() {
System.out.println("执行unpark方法前");
LockSupport.unpark(thread1);
System.out.println("执行unpark方法后");
}
};
thread1.start();
thread2.start();
}
在上面的例子中,我们利用线程1和线程2分别调用park()以及unpark()方法。
参考文章:LockSupport工具