gpt4 book ai didi

java - wait() 和 yield() 的区别

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:04:01 24 4
gpt4 key购买 nike

到目前为止,我对 wait() 和 yield() 方法的理解是,yield() 在线程未执行任何任务并让 CPU 执行其他线程时调用。 wait() 在某些线程被搁置时使用,通常用于同步的概念。但是,我无法理解它们在功能上的区别,也不确定我所理解的是对还是错。有人可以解释一下它们之间的区别吗(除了它们所在的包装之外)。

最佳答案

aren't they both doing the same task - waiting so that other threads can execute?

甚至不接近,因为 yield()不会等待任何事情。

每个线程都可以处于多种不同状态中的一种:Running 意味着线程实际上正在 CPU 上运行,Runnable 意味着没有任何东西阻止线程从运行中除外,可能是它运行的 CPU 的可用性。所有其他状态都可以归为一个名为blocked 的类别。阻塞线程是在变为可运行状态之前等待某事发生的线程。

操作系统会定期抢占正在运行的线程:操作系统经常(在大多数操作系统上每秒 10 次到每秒 100 次之间)标记每个正在运行的线程并说,“轮到你了,转到运行队列的后面'(即,将状态从运行更改为可运行)。然后它让运行队列头部的任何线程使用该 CPU(即再次运行)。

当您的程序调用 Thread.yield() 时,它对操作系统说,“我还有工作要做,但它可能没有其他线程正在做的工作重要。请现在把我送到运行队列的后面。”如果线程有可用的 CPU 运行,那么它实际上将继续运行(即 yield() 调用将立即返回)。

当您的程序调用 foobar.wait() 时另一方面,它对操作系统说,“在其他线程调用 foobar.notify() 之前阻止我。

让步首先在非抢占式操作系统和非抢占式线程库中实现。在只有一个 CPU 的计算机上,多个线程运行的唯一方式是线程明确让步给彼此。

让步对于忙碌的等待也很有用。这就是一个线程通过坐在一个紧密的循环中等待某些事情发生的地方,一遍又一遍地测试相同的条件。如果条件依赖于某个其他线程来完成某些工作,则等待线程每次在循环中都会 yield() 以便让其他线程完成它的工作。

既然我们拥有为我们提供更高级别同步对象的抢占和多处理器系统和库,应用程序基本上没有理由需要调用 yield()不再。

关于java - wait() 和 yield() 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26798073/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com