Thread.sleep(0) vs Thread.sleep(1) vs Thread.yield() vs Object.wait()

简介: Thread.sleep(0) vs Thread.sleep(1) vs Thread.yield() vs Object.wait()

🍊下面是 Thread.sleep(0)Thread.sleep(1)Thread.yield()Object.wait() 方法之间的一些区别:

Thread.sleep(0) 允许当前正在运行的线程从执行状态退出,但并不能保证立即执行其他线程。它只是将当前线程的执行时间片分配给其他线程,但并不保证立即执行。

Thread.sleep(long millis) 允许当前正在运行的线程从执行状态退出,并在指定的时间间隔后恢复执行。

Thread.yield() 允许当前正在运行的线程从执行状态退出,使当前线程从执行状态(运行状态)变为可执行态(就绪状态),但并不能保证立即执行其他线程。它只是将当前线程的执行时间片分配给其他线程,但并不保证立即执行。Thread.yield()方法并不是仅仅选择让步于同等或者更高优先级的线程。高优先级的线程也会让步与低优先级的线程。因此高优先级仅仅是线程获得的CPU时间片更多一些,相对执行到的机会更大,并不是一定先执行。

Object.wait() 允许当前正在运行的线程从执行状态退出,直到其他线程调用该对象的 notify() 或 notifyAll() 方法,或者超时为止。

这些方法都可以用于线程调度和同步。但是,它们之间有一些重要的区别,应根据具体情况选择使用。

🍊需要注意⚠️的点:

对于 Thread.sleep(0) 和 Thread.yield(),它们都是为了让出 CPU 时间片,但是它们的执行效果是不确定的。Thread.sleep(0) 可能会在下一次调度时才进行调度

Thread.sleep(0) 通常用于在轮询循环中释放 CPU 时间片。例如,假设你正在执行一个无限循环,每次循环中都需要执行一些计算。如果你在循环内部调用 Thread.sleep(0),则当前线程会在执行计算之后立即释放 CPU 时间片,以便其他线程可以运行。

在使用 Thread.sleep(0) 时,应该注意以下几点

它只是尽力让出 CPU,但并不能保证线程一定会让出 CPU。

它不能保证线程在挂起后立即恢复。

它不能保证线程在恢复后立即获得 CPU。

在大多数情况下,你不应该使用 Thread.sleep(0)。相反,应该使用其他方法,例如 Thread.yield() 或 Object.wait(),来保证线程让出 CPU。

如果你的程序只有一个线程,或者你希望当前线程能够尽可能快地执行完毕,那么使用 Thread.sleep(0) 将不会有任何作用。

你应该注意,使用 Thread.sleep(0) 来释放 CPU 时间片并不总是最佳方法。有时候,使用线程互斥或其他同步机制可能会更加有效。

关于Thread.sleep(0)、Thread.sleep(1)更多相关信息,参考此文章:

你真的了解Thread.sleep(0)吗?以及Thread.sleep(1) vs Thread.sleep(0)

相关文章
|
前端开发
异步转同步的几种方法
在循环等待中,我们可以使用一个变量来指示异步操作是否已完成。然后,我们可以在循环中检查该变量,如果它指示异步操作已完成,则退出循环。
953 0
|
C# 容器
WPF技术之HorizontalAlignment和VerticalAlignment
HorizontalAlignment和VerticalAlignment是用来确定控件在其父容器中的水平和垂直位置的属性。
2018 0
WPF技术之HorizontalAlignment和VerticalAlignment
|
消息中间件 缓存 算法
G1原理—10.如何优化G1中的FGC
本文主要探讨G1垃圾回收器中的FGC(Full GC)优化问题,分析其触发原因及优化策略。首先,通过一个实际案例(Kafka发送重试+`subList`导致List不断增大)展示FGC的产生过程及其影响。其次,对比G1与ParNew + CMS的FGC触发机制,指出G1的FGC更严重的原因,包括更大的堆内存管理需求、苛刻的触发条件以及复杂的RSet处理。最后,介绍FGC相关参数优化思路,如调整`-XX:G1HeapRegionSize`、`-XX:G1ReservePercent`等参数,以提升垃圾回收效率,减少FGC的发生频率。总结强调避免FGC的核心在于让垃圾回收速度匹配垃圾产生速度。
G1原理—10.如何优化G1中的FGC
|
7月前
|
人工智能 安全
阿里巴巴 AI Coding 分享会 Qoder Together 杭州站诚邀你的参与!
Qoder Together ,不止技术分享,更是思维共振与灵感迸发。我们面向全球 AI Coding 爱好者,邀请 Qoder 团队、实战用户、AI Coding 探索者齐聚一堂,交流激发创意,碰撞拓展边界,重新定义智能编程未来。
459 0
|
存储 C#
【C#】大批量判断文件是否存在的两种方法效率对比
【C#】大批量判断文件是否存在的两种方法效率对比
542 1
|
Java API 微服务
微服务保护之熔断降级
在微服务架构中,服务之间的调用是通过网络进行的,网络的不确定性和依赖服务的不可控性,可能导致某个服务出现异常或性能问题,进而引发整个系统的故障,这被称为 微服务雪崩。
372 0
|
缓存 Dubbo Java
Dubbo线程模型设计解析
该文章主要介绍了Dubbo线程模型的设计解析,包括Dubbo作为一个支持大量并发请求的网络框架的特点,以及其线程模型的工作原理。
WPF/C#:程序关闭的三种模式
WPF/C#:程序关闭的三种模式
418 0