一. LockSupport说明
LockSupport
是java.util.concurrent.locks
包中的一个重要工具类,LockSupport
提供了一组静态方法用于阻塞/唤醒线程,方法签名如下所示。
public static void park()
public static void park(Object blocker)
public static void parkNanos(long nanos)
public static void parkNanos(Object blocker, long nanos)
public static void parkUntil(long deadline)
public static void parkUntil(Object blocker, long deadline)
public static void unpark(Thread thread)
将LockSupport
的方法进行整理如下。
方法 | 说明 |
---|---|
park() | 将调用park() 方法的线程阻塞,响应中断。 |
parkNanos() | 将调用parkNanos() 方法的线程阻塞,并指定阻塞时间,响应中断。 |
parkUntil() | 将调用parkUntil() 方法的线程阻塞,并指定截止时间点,响应中断。 |
unpark(Thread thread) | 唤醒传入的线程。 |
二. 线程睡眠/阻塞/等待的对比
已知让线程睡眠(阻塞或等待)的方式有四种,分别是Thread.sleep(time)
,LockSupport.park()
,Object.wait()
和Condition.await()
,现在对上述四种方式进行一个简单对比,如下表所示。
方式 | 说明 |
---|---|
Thread.sleep(time) | 调用该方法必须指定线程睡眠的时间,睡眠中的线程可以响应中断并抛出中断异常,调用该方法时不需要线程持有锁资源,但是持有锁资源的线程调用该方法睡眠后不会释放锁资源。 |
LockSupport.park() | 调用该方法的线程会被阻塞,被阻塞中的线程可以响应中断但不会抛出中断异常,调用该方法时不需要线程持有锁资源,但是持有锁资源的线程调用该方法睡眠后不会释放锁资源 |
Object.wait() | 调用该方法的线程会进入等待状态,等待状态中的线程可以响应中断并抛出中断异常,调用该方法时需要线程已经持有锁资源,调用该方法后会释放锁资源。 |
Condition.await() | 调用该方法的线程会进入等待状态,等待状态中的线程可以响应中断并抛出中断异常,调用该方法时需要线程已经持有锁资源,调用该方法后会释放锁资源。 |