到目前为止,我对wait()和yield()方法的理解是,当线程没有执行任何任务并让CPU执行其他线程时,会调用yield()。 wait() 当某个线程被搁置时使用,通常用于同步的概念。但是,我无法理解它们功能的差异,并且不确定我的理解是对还是错。有人可以解释一下它们之间的区别(除了它们所在的包)。
它们不是都在执行相同的任务 - 等待其他线程可以执行吗?
甚至还不够接近,因为yield()
才不是wait为了任何东西。
每个线程都可以处于多种不同状态之一:Running意味着线程实际上在CPU上运行,Runnable意味着没有什么可以阻止线程运行,除了可能有可用的 CPU 来运行它。所有其他状态都可以归为一个类别,称为blocked。阻塞线程是指在变为可运行之前等待某些事情发生的线程。
操作系统preempts定期运行线程:每隔一段时间(在大多数操作系统上每秒 10 次到每秒 100 次),操作系统会标记每个正在运行的线程并说:“轮到你了,转到运行队列的后面” (即,将状态从“运行”更改为“可运行”)。然后,它让位于运行队列头部的任何线程使用该 CPU(即,再次运行)。
当你的程序调用Thread.yield()
,它对操作系统说:“我还有工作要做,但它可能不如其他线程正在做的工作那么重要。请立即将我发送到运行队列的后面。”如果有可用的 CPU 供线程运行,那么它实际上将继续运行(即,yield() 调用将立即返回)。
当你的程序调用foobar.wait()
另一方面,它对操作系统说:“阻止我,直到其他线程调用foobar.notify()
.
Yielding 最初是在非抢占式操作系统和非抢占式线程库中实现的。在一台只有一个CPU的计算机上,only当线程显式地相互让步时,就会有多个线程运行。
屈服也对忙着等待。这就是线程通过坐在紧密循环中一遍又一遍地测试相同条件来等待某些事情发生的地方。如果条件依赖于其他线程来完成某些工作,则等待线程每次循环时都会使用yield(),以便让其他线程完成其工作。
现在我们已经有了抢占式和多处理器系统以及为我们提供更高级别同步对象的库,应用程序基本上没有理由需要调用yield()
不再了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)