Java并发编程之LockSupport

2022-07-26 17:07:35 浏览数 (1)

LockSupport简介

LockSupport是JDK提供的一个线程工具类,它位于rt.jar下面,它的主要作用是挂起和唤醒线程,LockSupport的实现是基于 Unsafe类的,使用LockSupport类的每一个线程都会与它关联一个许可证。

LockSupport主要方法

void unpark(Thread thread);

unpark()用来唤醒被挂起的线程,参数Thread为被阻塞的线程。

void park();

用来挂起当前线程,只有使用unpark(Thread thread)或中断线程才会返回。

代码语言:javascript复制
public class LockSupportTest {
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(() -> {
            System.out.println("child thread start ");
            LockSupport.park();
            System.out.println("child thread end");
        });
        thread.start();
        Thread.sleep(2000);
        System.out.println("main thread");
        LockSupport.unpark(thread);
    }
}

如上,子线程输出child thread start 被阻塞,然后在主线程中使用LockSupport.unpark(thread)唤醒子线程,才往下执行。

使用线程中断返回
代码语言:javascript复制
public class LockSupportTest {
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(() -> {
            System.out.println("child thread start ");
            LockSupport.park();
            System.out.println("child thread end");
        });
        thread.start();
        System.out.println("main thread");
        thread.interrupt();
    }
}

void park(Object blocker);

挂起线程,加了一个参数,其目的只是使线程对战提供更多的阻塞信息。

代码语言:javascript复制
public class LockSupportMainTest {
    public void test(){
        LockSupport.park(this);
    }
    public static void main(String[] args) {
        LockSupportMainTest lockSupportMainTest = new LockSupportMainTest();
        lockSupportMainTest.test();
    }
}

如上我们将this(LockSupportMainTest)作为park的参数,那么在线程堆栈的信息中将会记录LockSupportMainTest

查看线程堆栈信息

1.jps查看pid

2.jstack pid查看线程堆栈信息

没有使用参数前(LockSupport.park())
使用参数后(LockSupport.park(this))

使用参数后多了一行- parking to wait for <0x000000076c094448> (a concurrent.locksupport.LockSupportMainTest)

关于下面的方法中有blocker参数的,就不再提。

void parkNanos(long nanos);

此方法和park()方法类似,不同之处是它传入了一个纳秒参数nanospark()方法如果拿到许可证(unpark(thread))后就返回,如果没有 拿到许可证,那么会一直被挂起,而parkNanos(long nanos)如果拿到许可证,也会立马返回,如果拿不到,则会在nanos单位时间后返回。

代码语言:javascript复制
public class LockSupportI {
    public static void main(String[] args) {
        System.out.println("start ");
        //等待2秒后返回
        LockSupport.parkNanos(2000000000);
        System.out.println("end");
    }
}

void parkNanos(Object blocker, long nanos);

此方法和parkNanos(long nanos)一样,只是加入blocker参数,其目的只是使线程对战提供更多的阻塞信息。

parkUntil(long deadline);

此方法的参数deadline代表到什么时间返回,单位为毫秒,例如,现在是2022/2/11 11:11:11,deadline我设置到2022/2/11 11:11:20(转换为毫秒), 那么就隔了9秒,如果当前线程拿到许可证(unpark(thread))后就立刻返回,如果没有拿到,就9秒后返回。

代码语言:javascript复制
public class LockSupportI {
    public static void main(String[] args) {
        System.out.println("start ");
        //当前时间的3秒后返回
        LockSupport.parkUntil(System.currentTimeMillis()   3000);
        System.out.println("end");
    }
}

void parkUntil(Object blocker, long deadline);

parkUntil(long deadline)一样,只是加入blocker参数,其目的只是使线程对战提供更多的阻塞信息。

今天的分享就到这里,感谢你的观看,下期间

0 人点赞