- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
到目前为止,我对 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/
function* generatorFunction() { yield (yield 1)(yield 2)(yield 3)(); } var iterator = generatorFun
ECMAScript 6 应该带来生成器函数和迭代器。生成器函数(具有 function* 语法)返回一个迭代器。迭代器有一个 next 方法,当重复调用时,该方法会执行生成器函数的主体,并在每个 y
ECMAScript 6 应该引入生成器函数和迭代器。生成器函数(具有 function* 语法)返回迭代器。迭代器有一个 next 方法,当重复调用时,它会执行生成器函数的主体,在每个 yield
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 2 年前。 Improve t
自 python 2.5 以来,可以将 send()、throw()、close() 放入生成器中。在定义的生成器中,可以通过执行以下操作来“捕获”发送的数据: def gen(): whil
return的区别和 yield似乎很清楚,直到我发现还有 yield from以及将两者结合起来的可能性 return和 yield在完全相同的功能! 我对return的理解之后的一切都是 不是 执
假设我有这个部分,我正在尝试渲染 #layouts/_subheader.html.erb 当我在这样的 View 中使用这个部分时 Content For Yield
yield操作符是由编译器在底层实现的,该编译器生成一个实现符合 IEnumerable 的状态机的类。和 IEnumerator . 给定一个罗斯林 MethodDeclarationSyntax
$item) echo "$index $item" . PHP_EOL; } resolve(generator1()); echo PHP_EOL; resolve(gener
这个问题在这里已经有了答案: Why converting list to set is faster than converting generator to set? (1 个回答) List c
是否有一个单行代码来获取生成器并生成该生成器中的所有元素?例如: def Yearly(year): yield YEARLY_HEADER for month in range(1, 13)
刚发现yield from 结构,在我看来这有点像反向的yield,而不是从生成器中获取对象,您插入/将对象发送到生成器。喜欢: def foo(): while True:
考虑以下代码: def mygen(): yield (yield 1) a = mygen() print(next(a)) print(next(a)) 输出产量: 1 None 解释器
Guido van Rossum,在 2014 年关于 Tulip/Asyncio 的演讲中 shows the slide : Tasks vs coroutines Compare: res =
谁能帮我理解“yield self”和“yield”的区别? class YieldFirstLast attr_accessor :first, :last def initiali
这是我目前使用 Laravel 5 实现的 Open Graph 标签: app.blade.php @yield('title') page.blade.php @extends('app'
在 Tornado 中,我们通常会编写如下代码来异步调用函数: class MainHandler(tornado.web.RequestHandler): @tornado.gen.coro
本文整理了Java中aQute.bnd.indexer.analyzers.Yield.yield()方法的一些代码示例,展示了Yield.yield()的具体用法。这些代码示例主要来源于Github
我们有超过 100 个共同基金的每日返回,我们希望将这些返回转换为月度返回。每月返回不应是每个月的平均值,而是每个月末的资金返回。基金在不同的时间点开始和结束,它们需要自己保留(不是每个月的共同基金
如何实现 C# yield return使用 Scala 延续?我希望能够编写 Scala Iterator s 风格相同。在 this Scala news post 的评论中有刺伤,但它不起作用(
我是一名优秀的程序员,十分优秀!