java并发编程LockSupport讲解

本文详细介绍了JUC提供的LockSupport工具类,包括其主要方法及其使用方式。LockSupport允许线程在任意位置阻塞与唤醒,无需获取锁即可实现,提供park与unpark等核心方法。
概述

LockSupport是JUC提供的一个线程阻塞工具类,所有的方法都是静态方法,可以让线程在任意位置阻塞,和唤醒线程。

主要方法
//blocker的作用是在dump线程的时候看到阻塞对象的信息
public static void park(Object blocker); // 阻塞当前线程
public static void parkNanos(Object blocker, long nanos); // 阻塞当前线程,不过有超时时间的限制
public static void parkUntil(Object blocker, long deadline); // 阻塞当前线程,直到某个时间
public static void park(); // 阻塞当前线程
public static void parkNanos(long nanos); // 阻塞当前线程
public static void parkUntil(long deadline); // 阻塞当前线程
public static void unpark(Thread thread); // 唤醒指定线程

使用:

public class LockSupportDemo {

    static class Task1 implements Runnable{

        @Override
        public void run() {
				//阻塞住当前线程
                LockSupport.park();
                System.out.println("aaa");
          
        }
    }



    public static void main(String[] args) {
        Thread thread = new Thread(new Task1());
        thread.start();
        try {
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //睡眠五秒后打印bbb,然后唤醒thread 线程
        System.out.println("bbb");
        LockSupport.unpark(thread);

    }
}

因为唤醒线程在打印bbb后面,所以对于控制台打印bbb会在aaa的前面。
在这里插入图片描述
假如去掉阻塞和唤醒。那样aaa就会在前面。
在这里插入图片描述

park()和unpark方法 和 wait 和 notify方法功能有一定的类似,但是park()和unpark方法 无需获取锁就可以实现,但是wait 和 notify必须要获取锁,在同步代码块里面调用,否则会抛出异常。

park和unpark 与 wait notify 不会交叉使用,也就是park线程不能用notify来唤醒。 wait线程也不能用unpark来唤醒。

parkUntil方法传入一个Long类型,该类型是一个时间戳,表示阻塞到哪个时候,绝对时间戳,单位毫秒。

static class Task1 implements Runnable{

        @Override
        public void run() {
        			//System.currentTimeMillis()表示获取当前时间戳,加上3000毫秒,表示
        			//阻塞3秒期间没有手动唤醒,三秒后会字段唤醒。
                    LockSupport.parkUntil(System.currentTimeMillis() + 3000);
                    System.out.println("aaa");


        }
    }

parkNanos方法也是传入一个Long类型,表示当阻塞这个时间后,没有手动唤醒,就自动唤醒该线程。单位纳秒

static class Task1 implements Runnable{

        @Override
        public void run() {
					//3000000000纳秒=3秒,表示park3秒。
                    LockSupport.parkNanos(1000000000L);
                    System.out.println("aaa");


        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值