await/wait 与sleep、yield间的区别

本文深入解析线程控制机制,对比sleep、yield、await/wait方法在Java中如何影响线程状态及锁行为。揭示这些方法在不同场景下如何运作,包括它们对线程调度的影响以及在特定条件下如何使用。

是否释放锁:调用sleep和yield的时候不释放当前线程所获得的锁,但是调用await/wait的时候却释放了其获取的锁并阻塞等待。

调用后何时恢复

# sleep让线程阻塞,且在指定的时间之内都不会执行,时间到了之后恢复到就绪状态,也不一定被立即调度执行;

# yield只是让当前对象回到就绪状态,还是有可能马上被再次被调用执行。

# await/wait,它会一直阻塞在条件队列之上,之后某个线程调用对应的notify/signal方法,才会使得await/wait的线程回到就绪状态,也是不一定立即执行。

谁的方法:yield和sleep方法都是Thread类的,而wait方法是Object类的,await方法是Condition显示条件队列的。

执行环境:yield和sleep方法可以放在线程中的任意位置,而await/wait方法必须放在同步块里面,否则会产生运行时异常。


--------------------- 
作者:小弟季义钦 
来源:优快云 
原文:https://blog.youkuaiyun.com/jiyiqinlovexx/article/details/51052592 
版权声明:本文为博主原创文章,转载请附上博文链接!

### 关于 `yield` `wait` 的用法 #### 使用 `yield` `yield` 是 Python 中用于定义生成器的关键字。当函数中包含 `yield` 表达式时,该函数会变成一个生成器对象而不是立即执行。每次调用生成器的 `__next__()` 方法(或内置的 `next()` 函数),它会在上次离开的地方继续执行直到遇到下一个 `yield`。 ```python def simple_generator(): yield "First" yield "Second" yield "Third" gen = simple_generator() print(next(gen)) # 输出: First print(next(gen)) # 输出: Second print(next(gen)) # 输出: Third ``` 这种特性使得处理大量数据流变得高效且内存友好[^1]。 #### 使用 `wait` 在异步编程环境中,如 asyncio 库中的协程可以使用 `await` 来等待另一个协程完成。然而,在某些情况下可能需要让当前线程暂停一段时或者等到某个条件满足再继续运行;这时就可以利用 `time.sleep(seconds)` 或者更推荐的方式是在支持的任务调度框架里通过特定方法实现延迟操作——即所谓的“等待”。 对于多线程或多进程应用来说,“等待”的概念还涉及到同步机制,比如锁、事件等来协调不同线程/进程的工作流程[^2]。 具体到像测试图形界面 (GUI) 这样的场景下,模拟用户的交互行为并验证预期的结果可能会比较复杂。为了确保自动化测试能够按照预设路径顺利进行下去,通常还需要考虑如何有效地管理这些等待时以及异常情况下的恢复策略。 另外,在 libevent 类库中提供了 `event_add_timer()` `event_remove_timer()` 接口用来添加移除定时器事件。这里提到的是有关超时设置的操作指南,虽然不是直接讨论 `yield` `wait` ,但是展示了另一种形式上的“等待”,即基于事件驱动模型下的延时控制逻辑[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值