wait() 和yield() 之间的区别

2024-04-03

到目前为止,我对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(使用前将#替换为@)

wait() 和yield() 之间的区别 的相关文章

  • 配置 Eclipse 将 App Engine 类预先捆绑到单个 JAR 中以加快预热速度

    在与另一家同样使用 App Engine 的公司的同事进行讨论后 他告诉我 他通过以下步骤成功地将应用程序预热时间从约 15 秒缩短到约 5 秒 配置 Eclipse 将编译过程中生成的类捆绑到单个 JAR 文件中 配置 Eclipse 以
  • Java 8 可选

    我想检查特定对象大小是否大于 0 如果它大于 0 那么我想创建一个可选对象 如果不是 那么我想返回一个可选的空对象 这是java代码的长版本 if fooA size gt 0 return Optional of new Foo else
  • 将 java 方法参数设置为最终参数

    那有什么区别final在下面的代码之间进行 将参数声明为有什么好处final public String changeTimezone Timestamp stamp Timezone fTz Timezone toTz return pu
  • Maven项目中的HDF5

    我正在尝试将 hdf hdf5lib H5 导入到 NetBeans 中的 Maven 项目中 它有这个作为导入行 import hdf hdf5lib H5 正如这里所建议的 https support hdfgroup org prod
  • 带嵌入式 tomcat 的 spring-boot 不会将请求分派到控制器

    我有一个使用 spring boot 和嵌入式 Tomcat 容器的应用程序 据我所知 我的代码与 spring boot 相同示例项目 https github com spring projects spring boot tree m
  • 简单的Java程序插入USB热点后速度慢100倍

    我有以下Java程序 class Main public static void main String args throws java io IOException long start System nanoTime java io
  • 竞争条件和 Clojure Atoms

    clojure atom 的文档指出 Changes to atoms are always free of race conditions 然而 竞争条件不仅是根据更改定义的 而且是在不同线程中并行逻辑操作的上下文中定义的 我想知道 保证
  • 相对重力

    我最近开始使用jMonkey引擎 这非常好 但我在尝试实现相对重力时陷入了困境 我想让行星彼此围绕轨道运行 不一定是完美的圆形轨道 取决于速度 所以每个对象都应该影响其他对象 我现在拥有的 关闭全球重力 bulletAppState get
  • org.apache.poi 中的异常

    我试图编写一个可以读取和写入的程序 xlsx文件中 下面提供的代码旨在能够编写其第一个 Excel 程序 package excel reader import java io FileOutputStream import java io
  • 更改JavaFX TableView字体大小[重复]

    这个问题在这里已经有答案了 您好 我想在表视图列内的文本上设置字体 我如何用 Java 做到这一点 这是我的代码 感谢帮助 private final TableView
  • 用二进制数、常规数字和格雷编码填充矩阵

    我有一个包含 1 s 或 0 s 的矩阵 用于创建二进制数 其宽度为n 对于 n 2 和 n 3 它看起来像 00 000 01 001 10 010 11 011 100 101 110 111 等等 现在我正在使用以下代码来生成它 in
  • Java中如何将Object[]转换为String[]?

    我有一个关于 Java 的问题 我有一个Object Java默认的 不是用户定义的 我想将它转换为String 谁能帮我 谢谢 这是转换 for int i 0 i lt objectArr length i try strArr i o
  • 如何在列表视图中选择时启用视频序列自动播放?

    大家好 有人可以与我分享一下我如何编写我的 viewvideo java 类 以便它允许自动播放视频功能 自动排序在列表视图中播放所选视频的任务 从当前位置到最新录制的视频 按顺序直到最新的视频播放完毕 这类似于 YouTube 自动播放功
  • Java泛型类型参数中的问号是什么意思? [复制]

    这个问题在这里已经有答案了 这是取自斯坦福解析器附带的一些示例的一小段代码 我已经用 Java 进行了大约 4 年的开发 但从未对这种风格的代码应该表示什么有非常深入的理解 List
  • 原子整数的compareandexchange()与compareandset()

    在研究 AtomicInteger 时 我发现这个 API 提供了两种方法 比较和交换 如果当前值被引用 则自动将该值设置为 newValue to 作为见证值 预期值 记忆效应为 由指定VarHandle compareAndExchan
  • 使用替换但不使用根元素的 Jaxb 继承

    我正在浏览布莱斯的博客http blog bdoughan com 2010 11 jaxb and inheritance using substitution html http blog bdoughan com 2010 11 ja
  • 如何使用 iBatis (myBatis) 的注释进行 IN 查询?

    我们只想在 MyBatis 中使用注释 我们确实在努力避免使用 xml 我们尝试使用 IN 子句 Select SELECT FROM blog WHERE id IN ids List
  • python 的 fcntl.flock 函数是否提供文件访问的线程级锁定?

    Python 的 fcnt 模块提供了一种名为 flock 1 的方法来证明文件锁定 其描述如下 对文件执行锁定操作op 描述符 fd 文件对象提供 fileno 方法被接受为 出色地 请参阅 Unix 手册集群 2 了解详情 在某些系统上
  • 如何将元素添加到通用集合

    我想知道如何将专用对象添加到通用集合中 我正在使用以下代码 Collection
  • Spring Boot 2 中的 401 代替 403

    With 春季启动 https projects spring io spring boot 1 5 6 发布我能够发送 HTTP 状态代码401代替403如中所述如果请求未经身份验证的uri 如何让Spring Security响应未经授

随机推荐

  • .htaccess 中单个 RewriteCond 的多个 RewriteRules

    我的 htaccess 中有以下命令 RewriteCond HTTP HOST www a z0 9 example com NC RewriteRule a z 2 1 2 L RewriteRule 0 9 a z 2 1 3 2 L
  • pieCSS3:不在本地四舍五入

    我正在尝试使用饼图获得圆角 ul li webkit border radius 8px 8px 0 0 moz border radius 8px 8px 0 0 border radius 8px 8px 0 0 color FFFFF
  • 从 API 控制器调用 POST 方法

    我有一个名为 MyFIlesController 的 API 控制器 在其中 我有这个方法 POST api myfiles public void Post FromBody string value 以下是我用 Fiddler 的调用方
  • 有没有java图像库?

    我是 java 图像处理新手 我的任务是重新调整网站图像的大小和比例 有没有一个简单的库可以完成这项任务 一个我必须下载 jar 的库 添加到我的项目中 我不喜欢被迫在 Windows 上安装编解码器和文件 我需要该库仅支持基本功能 Lib
  • Visual Studio 在断点处冻结

    自一周前以来 我在 VS2010 中看到了一个非常烦人的行为 当我正在调试一个项目时 调试器在断点处停止 Windows 冻结了近十秒 我说 Windows死机 是因为这段时间鼠标和键盘没用 该问题仅在我调试特定项目时发生 并且我在两台不同
  • 使用 Java 在 Mac 上以编程方式发送电子邮件(通过 Mac 邮件客户端)

    我对这个问题做了很多研究 但似乎无法为我的问题提出可靠的解决方案 我正在开发一个 Java 客户端应用程序 它 应该 允许用户从 Mac 地址簿中导入联系人 方法是以列表格式获取联系人 并允许用户选择一个子集 全部 然后单击一个按钮 将 邀
  • Java中的Goto语句[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我执行了下面的代码Eclipse http en wikipedia org wiki Eclipse 28software 29 但是GO
  • 人眼注视检测:识别用户正在看板上的位置[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我正在开发一个项目 上面有板和相机 目标是识别正在看黑板的学生 并确定他们视线的位置 在黑板上 目前 我计划从以下几个方面来应对挑
  • 如何关闭 ASP.NET 必填字段验证器“失去焦点”行为

    我有一些代码 其中一个控件需要两个单独的必填字段验证器 两个验证器都位于单独的验证组中 然后由两个单独的按钮进行验证 当单击按钮时 这种方法效果很好 但如果我在文本框中输入一个值然后将其删除 两个验证器都会显示 有没有办法关闭这种 失去焦点
  • boto s3 Bucket 与 get_bucket

    我尝试访问存储桶内的密钥 尽管我有该密钥的权限 但我没有该权限 为了能够做到get key this is my key 我需要桶对象 conn boto connect s3 key secret key my bucket conn g
  • 实体框架 4 的 System.Reflection.ReflectionTypeLoadException

    我在 Windows 窗体应用程序中使用 EF4 每当我在未安装 Visual Studio 2010 的计算机中运行发布文件时 我都会遇到问题 我总是收到此错误 System Reflection ReflectionTypeLoadEx
  • 如何修改Makefile以支持交叉编译?

    我有以下 Makefile CC g top srcdir SRC DIR cpp src INCLUDES I top srcdir I top srcdir command classes I top srcdir platform I
  • 从 URL 加载 UITableViewCell 的图像(需要异步加载)

    我有一个自定义类 它可以解析 XML 并获取图像的 URL 字符串 我将其存储在数组中 然后我想检索这些字符串来加载图像并将每个字符串显示在 UITableViewCell 中 这是我的代码 UITableViewCell tableVie
  • 禁用 yum 事务检查文件冲突

    如何禁用文件的 yum 事务检查 Transaction check error file usr local xenco backend current from install of xenco rr 1 9 6 104 x86 64
  • Ruby:对象深复制

    我正在研究一些在 Ruby 中深度复制对象的技术 MRI 1 9 3 我遇到了以下示例 但我不确定 dup方法实施 我测试了它并且它确实有效 但是我不理解该方法的逻辑步骤 因此我不舒服在我自己的代码中使用它 是声明 name name du
  • 使用 Python Flask 运行 REST API 版本的最佳方法是什么 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在 Python Flask 中创建 REST API 想知道创建引用特定 git 标签的版本控制 API 的选项有哪些 我想要做的是指定
  • 结构数组初始化中的 MISRA-C 错误

    我有以下内容 typedef struct uint8 t BlockID uint32 t Copies uint16 t Size NVMM ConfigType const NVMM ConfigType NvmmCnf Layout
  • 交互式 Python:尽管正确导入了 line_profiler,但无法使 `%lprun` 工作

    Problem 大多数 iPython 神奇函数 对我来说立刻就可以正常工作 hist time prun等等 但是 我注意到 lprun无法使用 iPython 找到它 因为我最初安装了它 尝试解决 然后我发现我应该安装line prof
  • Google diff-match-patch:如何取消修补以获取原始字符串?

    我正在使用 Google diff match patch JAVA 插件在两个 JSON 字符串之间创建补丁并将补丁存储到数据库中 diff match patch dmp new diff match patch LinkedList
  • wait() 和yield() 之间的区别

    到目前为止 我对wait 和yield 方法的理解是 当线程没有执行任何任务并让CPU执行其他线程时 会调用yield wait 当某个线程被搁置时使用 通常用于同步的概念 但是 我无法理解它们功能的差异 并且不确定我的理解是对还是错 有人