LockSupport 挂起和唤醒线程

发布于 2024-03-18 09:37:17 字数 1593 浏览 18 评论 0

JDK 的工具类,作用是挂起和唤醒线程。

使用

public class LockSupprtTest {
    public static void main(String[] args) throws InterruptedException {

        Thread t1 = new Thread(() -> {
            System.out.println("t1 begin to park");

            LockSupport.park();//t1 挂起自身

            System.out.println("t1 unpark");
        });

        t1.start();

        Thread.sleep(1000);

        System.out.println("main thread begin unpark t1");

        LockSupport.unpark(t1);//main 线程调用 unpark 唤醒挂起的 t1 线程
    }
}
t1 begin to park
main thread begin unpark t1
t1 unpark

API

park()

除非有许可,否则禁用当前线程的线程调度。如果许可证可用,则将其消耗掉,并立即返回;否则,当前线程将被禁用,并在以下三种情况之一之前处于休眠:

  • 其他线程 unpark 当前线程
  • 其他线程 interrupt 当前线程
  • 虚假地调用返回。
    此方法不报告其中哪一个导致方法返回。调用者应重新检查导致线程首先停滞的条件。调用者还可以确定例如返回时线程的中断状态。

unpark(Thread thread)

唤醒某个线程。

parkNanos(long nanos)

nanos 参数为超时时间

park(Object blocker)

public static void park(Object blocker) {
    Thread t = Thread.currentThread();
    setBlocker(t, blocker);
    UNSAFE.park(false, 0L);
    setBlocker(t, null);
}
    
private static void setBlocker(Thread t, Object arg) {
    // Even though volatile, hotspot doesn't need a write barrier here.
    UNSAFE.putObject(t, parkBlockerOffset, arg);
}

blocker 参数的值实际上赋值给了 parkBlockerOffset 变量。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

嘿咻

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

qq_E2Iff7

文章 0 评论 0

Archangel

文章 0 评论 0

freedog

文章 0 评论 0

Hunk

文章 0 评论 0

18819270189

文章 0 评论 0

wenkai

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文