美文网首页
LockSupport线程阻塞工具类

LockSupport线程阻塞工具类

作者: 12点前睡觉hhh | 来源:发表于2019-05-31 10:02 被阅读0次

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则进行线程唤醒,否则直接退出。

相关文章

网友评论

      本文标题:LockSupport线程阻塞工具类

      本文链接:https://www.haomeiwen.com/subject/qlyvtctx.html