LockSupport线程阻塞工具类

LockSupport是一个非常方便使用的线程阻塞工具,它可以在线程内任意位置让线程阻塞。与Thread.suspend方法相比,它弥补了由于resume发生意外而导致的线程无法继续执行的问题;与Object.wait相比,它不需要先获得某个对象的锁,也不会抛出InterruptedException异常。

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):唤醒处于阻塞状态的指定线程

简单实例:

public class LockSupportDemo {
    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            LockSupport.park();
            System.out.println(Thread.currentThread().getName() + "被唤醒");
        });
        thread.start();
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        LockSupport.unpark(thread);
    }
}

LockSupport方法使用了类似信号量的机制。为每一个线程准备了一个许可,当调用park方法时,park会将许可置为0(消费这个许可)同时判断前值,如果前值小于1则说明前面被unpark过,则直接退出,否则使该线程阻塞。
当调用unpark方法时,会将许可置为1,同时判断前值,小于1则进行线程唤醒,否则直接退出。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容