LockSupport是一个非常方便使用的线程阻塞工具,它可以在线程内任意位置让线程阻塞。与Thread.suspend方法相比,它弥补了由于resume发生意外而导致的线程无法继续执行的问题;与Object.wait相比,它不需要先获得某个对象的锁,也不会抛出InterruptedException异常。
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):唤醒处于阻塞状态的指定线程
简单实例:
public class LockSupportDemo {
public static void main(String[] args) {
Thread thread = new Thread(() -> {
LockSupport.park();
System.out.println(Thread.currentThread().getName() + "被唤醒");
});
thread.start();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
LockSupport.unpark(thread);
}
}
LockSupport方法使用了类似信号量的机制。为每一个线程准备了一个许可,当调用park方法时,park会将许可置为0(消费这个许可)同时判断前值,如果前值小于1则说明前面被unpark过,则直接退出,否则使该线程阻塞。
当调用unpark方法时,会将许可置为1,同时判断前值,小于1则进行线程唤醒,否则直接退出。
网友评论