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

被折叠的 条评论
为什么被折叠?



