8.LockSupport


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. 线程1 线程2启动
  2. 线程1开始打印,线程2自锁
  3. 线程1打印完成之后,解锁线程2 ,然后自锁
  4. 线程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)
解锁线程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值