天天看点

Java并发编程知识点总结(十三)——LockSupport方法总结

文章目录

    • (一)、LockSupport概述
    • (二)、LockSupport常用方法
    • (三)、LockSupport使用方法

(一)、LockSupport概述

我们在前面分析ReentrantLock以及Condition通信机制的时候多次使用到LockSupport.park()以及LockSupport.unpark()方法。LockSupport是用来阻塞线程的工具,park()方法用来阻塞线程,unpark()方法用来唤醒线程。

LockSupport是不支持重入的,每一条线程都会对应一个许可,如果这个许可可用,调用park()方法就不会发生阻塞。但是如果不可用,调用park()方法就会发生线程阻塞,这时就可以使用unpark()方法来获取许可。

(二)、LockSupport常用方法

方法 功能
void park() 阻塞当前线程,如果调用unpark方法或者当前线程被中断,从能从park()方法中返回
void park(Object blocker) 功能同方法1,入参增加一个Object对象,用来记录导致线程阻塞的阻塞对象,方便进行问题排查
void parkNanos(long nanos) 阻塞当前线程,最长不超过nanos纳秒,增加了超时返回的特性
void parkNanos(Object blocker, long nanos) 功能同方法3,入参增加一个Object对象,用来记录导致线程阻塞的阻塞对象,方便进行问题排查
void parkUntil(long deadline) 阻塞当前线程,知道deadline
void parkUntil(Object blocker, long deadline) 功能同方法5,入参增加一个Object对象,用来记录导致线程阻塞的阻塞对象,方便进行问题排查
void unpark(Thread thread) 唤醒处于阻塞状态的指定线程

(三)、LockSupport使用方法

public static void main(String[] args) {
        //线程1
        Thread thread1 = new Thread() {
            @Override
            public void run() {
                System.out.println("执行park方法前");
                LockSupport.park();
                System.out.println("执行park方法后");
            }
        };
		//线程2
        Thread thread2 = new Thread() {
            @Override
            public void run() {
                System.out.println("执行unpark方法前");
                LockSupport.unpark(thread1);
                System.out.println("执行unpark方法后");
            }
        };
        thread1.start();
        thread2.start();
    }
           
Java并发编程知识点总结(十三)——LockSupport方法总结

在上面的例子中,我们利用线程1和线程2分别调用park()以及unpark()方法。

参考文章:LockSupport工具

继续阅读