LockSupport工具【线程阻塞和唤醒】✨ 每日积累

简介: LockSupport工具【线程阻塞和唤醒】✨ 每日积累
当需要阻塞或者唤醒一个线程时,可以使用LockSupport工具类来完成。LockSupport定义了一组公共静态方法,这些方法提供了最基本的阻塞和唤醒功能。

api解释如下


用于创建锁和其他同步类的基本线程阻塞原语。


这个类与每个使用它的线程相关联,一个许可证(在Semaphore类的意义上)。 如果许可证可用,则呼叫park将park返回,在此过程中消耗它; 否则可能会阻止。 致电unpark使许可证可用,如果尚不可用。 (与信号量不同,许可证不能累积,最多只有一个。)


方法park和unpark提供了阻止和解除阻塞线程的有效手段,该方法不会遇到导致不推荐使用的方法Thread.suspend和Thread.resume目的不能使用的问题:一个线程调用park和另一个线程之间的尝试unpark线程将保持活跃性,由于许可证。 另外,如果调用者的线程被中断, park将返回,并且支持超时版本。 park方法也可以在任何其他时间返回,因为“无理由”,因此一般必须在返回之前重新检查条件的循环中被调用。 在这个意义上, park作为一个“忙碌等待”的优化,不浪费时间旋转,但必须与unpark配对才能有效。


park的三种形式也支持blocker对象参数。 线程被阻止时记录此对象,以允许监视和诊断工具识别线程被阻止的原因。 (此类工具可以使用方法getBlocker(Thread)访问阻止程序 。)强烈鼓励使用这些形式而不是没有此参数的原始形式。 在锁实现中作为blocker提供的正常参数是this 。


这些方法被设计为用作创建更高级同步实用程序的工具,并且本身对于大多数并发控制应用程序本身并不有用。 park方法仅用于形式的构造:


 

while (!canProceed()) { ... LockSupport.park(this); }


其中既不canProceed也没有任何其他动作之前的呼叫park需要锁定或阻止。因为只有一个许可证与每个线程相关联, park任何中介使用可能会干扰其预期效果。


方法摘要

Modifier and Type

Method and Description
static Object getBlocker(Thread t) 返回提供给最近调用尚未解除阻塞的park方法的阻止程序对象,如果不阻止则返回null。
static void park() 禁止当前线程进行线程调度,除非许可证可用。
static void park(Object blocker) 禁止当前线程进行线程调度,除非许可证可用。
static void parkNanos(long nanos) 禁用当前线程进行线程调度,直到指定的等待时间,除非许可证可用。
static void parkNanos(Object blocker, long nanos) 禁用当前线程进行线程调度,直到指定的等待时间,除非许可证可用。
static void parkUntil(long deadline) 禁用当前线程进行线程调度,直到指定的截止日期,除非许可证可用。
static void parkUntil(Object blocker, long deadline) 禁用当前线程进行线程调度,直到指定的截止日期,除非许可证可用。
static void unpark(Thread thread) 为给定的线程提供许可证(如果尚未提供)。

简单用法

import java.util.concurrent.locks.LockSupport;
public class LockSupportTest {
    public static void main(String[] args) {
        final Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("thread 已挂起");
                //当前线程挂起
                LockSupport.park();
                //阻塞当前线程11纳秒
                LockSupport.parkNanos(11);
                //阻塞当前线程1000毫秒
                LockSupport.parkUntil(1000L);
                System.out.println("唤醒继续执行");
            }
        });
        thread.start();
        //在使用LockSupport.unpark(thread);时, 注释掉LockSupport.unpark(thread); thread线程持续被挂起而阻塞
        LockSupport.unpark(thread);
    }
}
相关文章
|
8天前
|
Java 数据库 Android开发
【专栏】Kotlin在Android开发中的多线程优化,包括线程池、协程的使用,任务分解、避免阻塞操作以及资源管理
【4月更文挑战第27天】本文探讨了Kotlin在Android开发中的多线程优化,包括线程池、协程的使用,任务分解、避免阻塞操作以及资源管理。通过案例分析展示了网络请求、图像处理和数据库操作的优化实践。同时,文章指出并发编程的挑战,如性能评估、调试及兼容性问题,并强调了多线程优化对提升应用性能的重要性。开发者应持续学习和探索新的优化策略,以适应移动应用市场的竞争需求。
|
7月前
|
安全 Java
【JavaSE专栏76】三态和五态,线程的不同状态:新建、运行、状态、阻塞、等待、计时等待状态
【JavaSE专栏76】三态和五态,线程的不同状态:新建、运行、状态、阻塞、等待、计时等待状态
|
8月前
|
Arthas IDE Java
一种获取阻塞线程栈帧数据的思路
一种获取阻塞线程栈帧数据的思路
128 2
|
8天前
|
消息中间件 Linux 调度
【Linux 进程/线程状态 】深入理解Linux C++中的进程/线程状态:阻塞,休眠,僵死
【Linux 进程/线程状态 】深入理解Linux C++中的进程/线程状态:阻塞,休眠,僵死
88 0
|
2天前
|
存储 网络协议 iOS开发
connect永远阻塞线程及解决方案
connect永远阻塞线程及解决方案
6 0
|
8天前
|
前端开发 JavaScript UED
由于JavaScript是单线程的,因此在处理大量异步操作时,需要确保不会阻塞UI线程
【5月更文挑战第13天】JavaScript中的Promise和async/await常用于处理游戏开发中的异步操作,如加载资源、网络请求和动画帧更新。Promise表示异步操作的结果,通过.then()和.catch()处理回调。async/await作为Promise的语法糖,使异步代码更简洁,类似同步代码。在游戏循环中,使用async/await可清晰管理资源加载和更新,但需注意避免阻塞UI线程,并妥善处理加载顺序、错误和资源管理,以保证游戏性能和稳定性。
22 3
|
8天前
|
监控
写一个线程来监控各线程是否发生阻塞
写一个线程来监控各线程是否发生阻塞
23 0
|
8月前
|
Arthas 测试技术
如何检测由synchronized或Lock引起的线程阻塞问题
如何检测由synchronized或Lock引起的线程阻塞问题
117 1
|
8月前
|
Arthas 消息中间件 监控
记一次SSL握手导致业务线程阻塞的案例分析
记一次SSL握手导致业务线程阻塞的案例分析
113 0
|
10月前
|
缓存 运维 监控
SSL Session默认设置导致线程阻塞了几十秒的案例分析
SSL Session默认设置导致线程阻塞了几十秒的案例分析
119 0