Java并发编程之LockSupport

LockSupport简介

LockSupport是JDK提供的一个线程工具类,它位于rt.jar下面,它的主要作用是挂起和唤醒线程,LockSupport的实现是基于 Unsafe类的,使用LockSupport类的每一个线程都会与它关联一个许可证。

LockSupport主要方法

void unpark(Thread thread);

unpark()用来唤醒被挂起的线程,参数Thread为被阻塞的线程。

void park();

用来挂起当前线程,只有使用unpark(Thread thread)或中断线程才会返回。

public class LockSupportTest {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(() -> {
System.out.println("child thread start ");
LockSupport.park();
System.out.println("child thread end");
});
thread.start();
Thread.sleep(2000);
System.out.println("main thread");
LockSupport.unpark(thread);
}
}

Java并发编程之LockSupport

如上,子线程输出child thread start 被阻塞,然后在主线程中使用LockSupport.unpark(thread)唤醒子线程,才往下执行。

使用线程中断返回

public class LockSupportTest {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(() -> {
System.out.println("child thread start ");
LockSupport.park();
System.out.println("child thread end");
});
thread.start();
System.out.println("main thread");
thread.interrupt();
}
}

void park(Object blocker);

挂起线程,加了一个参数,其目的只是使线程对战提供更多的阻塞信息。

public class LockSupportMainTest {
public void test(){
LockSupport.park(this);
}
public static void main(String[] args) {
LockSupportMainTest lockSupportMainTest = new LockSupportMainTest();
lockSupportMainTest.test();
}
}

如上我们将this(LockSupportMainTest)作为park的参数,那么在线程堆栈的信息中将会记录LockSupportMainTest

查看线程堆栈信息

1.jps查看pid
Java并发编程之LockSupport
2.jstack pid查看线程堆栈信息

没有使用参数前(LockSupport.park())

Java并发编程之LockSupport

使用参数后(LockSupport.park(this))

使用参数后多了一行- parking to wait for <0x000000076c094448> (a concurrent.locksupport.LockSupportMainTest) Java并发编程之LockSupport
关于下面的方法中有blocker参数的,就不再提。

void parkNanos(long nanos);

此方法和park()方法类似,不同之处是它传入了一个纳秒参数nanospark()方法如果拿到许可证(unpark(thread))后就返回,如果没有 拿到许可证,那么会一直被挂起,而parkNanos(long nanos)如果拿到许可证,也会立马返回,如果拿不到,则会在nanos单位时间后返回。

public class LockSupportI {
public static void main(String[] args) {
System.out.println("start ");
//等待2秒后返回
LockSupport.parkNanos(2000000000);
System.out.println("end");
}
}

void parkNanos(Object blocker, long nanos);

此方法和parkNanos(long nanos)一样,只是加入blocker参数,其目的只是使线程对战提供更多的阻塞信息。

parkUntil(long deadline);

此方法的参数deadline代表到什么时间返回,单位为毫秒,例如,现在是2022/2/11 11:11:11,deadline我设置到2022/2/11 11:11:20(转换为毫秒), 那么就隔了9秒,如果当前线程拿到许可证(unpark(thread))后就立刻返回,如果没有拿到,就9秒后返回。

public class LockSupportI {
public static void main(String[] args) {
System.out.println("start ");
//当前时间的3秒后返回
LockSupport.parkUntil(System.currentTimeMillis() + 3000);
System.out.println("end");
}
}

void parkUntil(Object blocker, long deadline);

parkUntil(long deadline)一样,只是加入blocker参数,其目的只是使线程对战提供更多的阻塞信息。


今天的分享就到这里,感谢你的观看,下期间

原文始发于微信公众号(刘牌):Java并发编程之LockSupport

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/150860.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!