8.LockSupport

£可爱£侵袭症+ 提交于 2020-01-13 02:02:44


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)
解锁线程

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!