| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> 线程休眠和指定唤醒—关于 LockSupport 相关介绍 -> 正文阅读 |
|
[Java知识库]线程休眠和指定唤醒—关于 LockSupport 相关介绍 |
线程休眠和指定唤醒:LockSupportJDK 中的 rt.jar 包里面的 LockSupport 是个工具类,它的主要作用是挂起和唤醒线程,该工具类是创建锁和其他同步类的基础。 LockSupport 类与每个使用它的线程都会关联一个许可证,在默认情况下调用 LockSupport 类的方法的线程是不持有许可证的。LockSupport 是使用 Unsafe 类实现的,以下是 LockSupport 相关函数介绍。
如果调用 park 方法的线程已经拿到了与 LockSupport 关联的许可证,则调用 LockSupport.park() 时会马上返回,否则调用线程会被禁止参与线程的调度,也就是会被阻塞挂起。 如下代码直接在 main函数里面调用 park 方法,
执行结果: 在去他线程调用 unpark(Thread thread) 方法并且将当前线程作为参数时,调用 park 方法而被阻塞的线程会返回。另外,如果其他线程调用了阻塞线程的 interrupt() 方法,设置了中断标志或者线程被徐家桓兴,则阻塞线程也会返回。所以在调用 park 方法时最好特使用循环条件判断方式。 和 wait/sleep 不同的是,由于调用 park() 方法而被阻塞的线程被其他线程中断而返回时并不会抛出 InterruptedException 异常。
当一个线程调用 unpark 时,如果参数 thread 线程没有持有 thread 与 LockSupport 类关联的许可证,则让 thread 线程持有。如果 thread 之前因调用 park() 而被挂起,则调用 unpark 后,该线程会被唤醒。如果 thread 之前没有调用park,则调用 unpark 方法后,再调用 park 方法,其会立即返回。
执行结果:
执行结果: 主线程休眠 1s 是为了让主线程调用 unpark 前让子线程先开始执行并调用 park 阻塞。 主线程执行了 unpark 方法,参数为子线程,这样做的目的是让子线程持有许可证,然后子线程调用的 park 方法就会返回了。 park 方法返回时不会告诉你它是因何种原因返回,所以调用者需要根据之前调用park方法的原因,再次检查条件是否满足,如果不满足则还需要再次调用 park 方法。 例如,根据调用前后中断状态的对比就可以判断是不是因为被中断才返回的。 为了说明调用 park 方法后的线程被中断后会返回,我们修改上面的代码,删除 LockSupport.unpark(thresd),然后添加 thread.interrupt();具体代码如下。
输出结果为: 在如上代码中,只有中断子线程,子线程才会结束运行,如果子线程不被中断,即使调用 unpark(thread) 方法子线程也不会结束。
3-6 的方法尽快补上~ |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 4:43:57- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |