LockSupport主要用于对线程执行暂停(park)和唤醒(unpark)
1. 简单示例
public class LockSupportTest {
static Thread t1,t2 = null;
public static void main(String[] args) {
t1 = new Thread(()->{
while(true){
System.out.println("t1");
LockSupport.unpark(t2);
LockSupport.park();
}
});
t2 = new Thread(()->{
while(true){
LockSupport.park();
System.out.println("t2");
LockSupport.unpark(t1);
}
});
t1.start();
t2.start();
}
}
线程1
线程2
启动线程1
开始打印,线程2
自锁线程1
打印完成之后,解锁线程2
,然后自锁线程2
解锁打印,然后解锁线程1
, 又进入第2步
2. 源码解读
2.1. park
public static void park()
park当前线程
public static void parkNanos(long nanos)
park当前线程,但是如果超过nanos纳秒后还没有被唤醒将自动唤醒
public static void park(Object blocker)
park当前线程,并设置线程的parkBlocker属性为blocker
public static void parkNanos(Object blocker, long nanos)
park当前线程,但是如果超过nanos纳秒后还没有被唤醒将自动唤醒,并设置线程的parkBlocker属性为blocker
public static void parkUntil(long deadline)
deadline是时间的毫秒表示
park当前线程,但是如果到达deadline代表的时间点后还没有被唤醒将自动唤醒
public static void parkUntil(Object blocker, long deadline)
deadline是时间的毫秒表示
park当前线程,但是如果到达deadline代表的时间点后还没有被唤醒将自动唤,并设置线程的parkBlocker属性为blocker
这些方法都是用于park线程的, 根据条件和需求不同选择不同的方法。
所有的park内部都是调用 UNSAFE.park(false, 0L);
这个方法是native方法(本地方法) 有两个参数
boolean isAbsolute true绝对 false 相对 所以parkUntil是true 其他都是false
long time 时间 0代表永不超时
1秒=1000毫秒 1毫秒=1000微秒 1微妙=1000纳秒
2.2. unpark
public static void unpark(Thread thread)
解锁线程