读书笔记《JAVA并发编程的艺术》 第五章 Java中的锁 5.5 LockSupport工具 5.6 Condition接口

本文详细介绍了Java并发包中LockSupport工具类的功能及其方法,包括阻塞与唤醒线程的操作,并对比了Condition接口与Object监视器方法的区别。此外,还通过示例展示了如何使用Condition实现有界队列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

5.5 LockSupport工具

作用:阻塞或者唤醒一个线程。

package java.util.concurrent.locks;

这里写图片描述

方法名称描述
void park()阻塞当前线程,调用unpark()或者被中断,才能从park()中返回
void parkNanos(long nanos)阻塞当前线程,最长不超过nanos纳秒
void parkUntil(long deadline)阻塞当前线程,直到deadline(从1970年开始到deadline时间的毫秒数)
void unpark(Thread thread)唤醒处于阻塞状态的线程thread

5.6 Condition接口

对比Object的监视器方法和Condition接口

对比项Object监视器方法Condition
前置条件获取对象的锁Lock.lock();lock.newCondition()获取Condition对象
调用方式直接调用,如object.wait()直接调用,如conditon.await()
等待队列个数一个多个
当前线程释放锁并进入等待状态支持支持
当前线程释放锁并进入等待状态,在等待状态中不响应中断不支持支持
当前线程释放锁并进入超时等待状态支持支持
当前线程释放锁并进入等待状态到将来的某个时间不支持支持
唤醒等待队列中的一个线程支持支持
唤醒等待队列中的所有线程支持支持

5.6.1 Condition接口与示例

这里写图片描述

使用方式,代码示例:

Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
public void conditionWait()throws InterruptedException{
    lock.lock();
    try {
        condition.await();
    } finally {
        lock.unlock();
    }
}
public void conditionSignal()throws InterruptedException{
    lock.lock();
    try {
        condition.signal();
    } finally {
        lock.unlock();
    }
}
方法名称描述
void await()当前线程进入等待状态直到被通知signal或中断
void awaitUninterruptibly当前线程进入等待状态直到被通知,对中断不敏感
long awaitNanos(long nanos)当前线程进入等待状态直到通知、中断、超时,返回值表示剩余的时间,如果返回值为0或者负值,就表示已经超时了
boolean awaitUntil(Date deadline)当前线程进入等待状态直到被通知、中断或者到某个时间,如果没有到指定时间就被通知,方法返回true,否则返回false
void signal()唤醒一个等待在Condition上的线程,该线程从等待方法返回前必须获取与Condition相关联的锁
void signalAll()唤醒所有等待在Condition上的线程,能够从等待方法返回的线程必须获取与Condition相关联的锁

示例2:有界队列,当队列为空时,队列的获取操作将会阻塞获取线程,知道队列中有新增元素,当队列已满时,队列的插入操作将会阻塞插入线程,直到队列出现“空位”。

public class BoundedQueue<T> {
private Object[] items;
private int addIndex, removeIndex, count;
private Lock lock = new ReentrantLock();
private Condition notEmpty = lock.newCondition();
private Condition notFull = lock.newCondition();

public BoundedQueue(int size) {
    items = new Object[size];
}

//添加一个元素,如果数组满,则添加线程进入等待状态,直到有空位
public void add(T t) throws InterruptedException {
    lock.lock();
    try {
        while (count == items.length) {
            notFull.await();
        }
        items[addIndex] = t;
        if (++addIndex == items.length) {
            addIndex = 0;
        }
        ++count;
        notEmpty.signal();
    } finally {
        lock.unlock();

    }
}

// 由头部删除一个元素,如果数组为空,则删除线程进入等待状态,直到有新添加元素
public T remove() throws InterruptedException {
    lock.lock();
    try {
        while (count == 0) {
            notEmpty.await();
        }
        Object x = items[removeIndex];
        if (++removeIndex == items.length) {
            removeIndex = 0;
        }
        --count;
        notFull.signal();
        return (T) x;
    } finally {
        lock.unlock();
    }
}}

当数组数量等于数组长度时,说明数组已经满了,则调用notFull.await(),当前线程随之释放锁并进入等待状态。
当数组数量不等于数组长度时,表示数组未满,则添加元素到数组中,同时通知等待在notEmpty上的线程,数组中已经有新元素可以获取。

内容概要:本文深入解析了扣子COZE AI编程及其详细应用代码案例,旨在帮助读者理解新一代低门槛智能体开发范式。文章从五个维度展开:关键概念、核心技巧、典型应用场景、详细代码案例分析以及未来发展趋势。首先介绍了扣子COZE的核心概念,如Bot、Workflow、Plugin、Memory和Knowledge。接着分享了意图识别、函数调用链、动态Prompt、渐进式发布及监控可观测等核心技巧。然后列举了企业内部智能客服、电商导购助手、教育领域AI助教和金融行业合规质检等应用场景。最后,通过构建“会议纪要智能助手”的详细代码案例,展示了从需求描述、技术方案、Workflow节点拆解到调试与上线的全过程,并展望了多智能体协作、本地私有部署、Agent2Agent协议、边缘计算插件和实时RAG等未来发展方向。; 适合人群:对AI编程感兴趣的开发者,尤其是希望快速落地AI产品的技术人员。; 使用场景及目标:①学习如何使用扣子COZE构建生产级智能体;②掌握智能体实例、自动化流程、扩展能力和知识库的使用方法;③通过实际案例理解如何实现会议纪要智能助手的功能,包括触发器设置、下载节点、LLM节点Prompt设计、Code节点处理和邮件节点配置。; 阅读建议:本文不仅提供了理论知识,还包含了详细的代码案例,建议读者结合实际业务需求进行实践,逐步掌握扣子COZE的各项功能,并关注其未来的发展趋势。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值