LockSupport 工具
当需要阻塞或者唤醒一个线程的时候,都会使用 LockSupport 工具类来完成响应工作。LockSupport 定义了一组的公共静态方法,这些方法提供了最基本的线程阻塞和唤醒功能。
以 park()开头的来阻塞线程
以 unpark()开头的来唤醒线程
一、阻塞线程
1、park(Object blocker)
blocker对象用来标识当前线程在等待的对象(阻塞对象)。该对象主要用于问题排查和系统监控。
public static void park(Object blocker) {
Thread t = Thread.currentThread();setBlocker(t, blocker);UNSAFE.park(false, 0L);setBlocker(t, null);}
有阻塞对象的方法,可以传递给开发人员更多的现场信息。
2、park()
阻塞当前线程,如果调用 unpark(Thread thread)方法或者当前线程被中断,曹能从 park()线程返回。
public static void park() {
UNSAFE.park(false, 0L);}
3、parkNanos(long nanos)
阻塞当前线程,最长不超过nanos纳秒。
public static void parkNanos(long nanos) {
if (nanos > 0)UNSAFE.park(false, nanos);}
4、parkUntil(long deadline)
阻塞当前对象,直到 deadline 时间。(从 1970 年开始到 deadline 时间的毫秒数)
public static void parkUntil(long deadline) {
UNSAFE.park(true, deadline);}
二、唤醒阻塞的线程
1、unpark(Thread thread)
唤醒处于阻塞状态的线程thread。
public static void unpark(Thread thread) {
if (thread != null)UNSAFE.unpark(thread);}