在 Java 的 main() 中对 Thread 实例运行 wait()

2023-11-27

我正在尝试 java.lang.Object 中 wait() 的定时版本,并观察到它在两种不同场景中的行为有所不同。

场景1:使用Thread中run()的默认定义

public static void main (String[] args) throws InterruptedException {
    Thread t = new Thread();    
    t.start();
    System.out.print("X");
    synchronized(t) { t.wait(10000);}
    System.out.print("Y");
}

关于场景1的问题:我在 X 和 Y 之间遇到延迟。这是因为我从 main 调用 wait() (即使在 t 上),因此正在使用主线程的调用堆栈,而不是第二个线程的调用堆栈?

场景2: 动态子类化 Thread 以覆盖 run() 以打印某些内容。

public static void main (String[] args) throws InterruptedException {
     Thread t = new Thread() {public void run() 
                     {System.out.print("I am the second thread.");}};
     t.start();
     System.out.print("X");
     synchronized(t) { t.wait(10000);}
     System.out.print("Y");
}

关于场景2的问题:我根本没有遇到任何延迟!仅仅因为我重写了 run() 就发生了什么变化?现在,每次我运行该程序时,它都会立即打印“XI am the secondary thread.Y”,没有任何延迟! wait()的作用去哪儿了?


你实际上已经明白了为什么你永远不应该打电话wait or notify(All)关于线程(请参阅 JavaDocs for Thread)。在内部,Thread使用wait和notifyAll来实现Thread.join(),所以第二种情况发生的是你的线程进入wait,但随后另一个线程死亡并调用notifyAll(),这会唤醒你的主线程。

Use Thread.sleep如果您只想等待一段时间,请使用Thread.join如果您确实想等待线程终止。另外,请阅读 javadocsObject为了正确使用wait, notify, and notifyAll.

javaDoc:

public final void join(long millis)
                throws InterruptedException

最多等待 millis 毫秒该线程终止。超时时间为 0 表示永远等待。此实现使用 this.wait 循环 调用以 this.isAlive 为条件。当一个线程终止时 this.notifyAll 方法被调用。建议申请 不要在 Thread 实例上使用 wait、notify 或 notifyAll。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Java 的 main() 中对 Thread 实例运行 wait() 的相关文章

随机推荐

  • 如何使用composer安装部分git存储库?

    我只想需要 git 存储库的子部分 而不是完整的东西 我想这样做的原因是因为存储库很大 就我而言 存储库是 https github com pubnub pubnub api git我只想要 php 目录 我在作曲家中定义了以下包 typ
  • OpenCV功能类似于matlab的“查找”

    我正在寻找 openCV 中的一个函数来帮助我制作图像蒙版 例如在 MATLAB 中 B A or B 零 大小 A B A 10 c 有些功能可以让你通过mask向他们提出论据 按照您描述的方式创建面具 我认为您正在追求Cmp 或 Cmp
  • 检查 Intent.ACTION_VIEW 上的用户操作

    我有一个填充了一些文件的列表视图 可以有多种类型 如 pdf 或文档 当用户单击一个文件时 我会获取文件 mime 类型并启动一个意图 让用户选择使用哪个应用程序来打开该文件 什么我想知道用户是否选择了某些内容 或者只是按回键而没有选择任何
  • 在 python 中填充队列并管理多处理

    我在 python 中遇到这个问题 我有一个 URL 队列 需要时不时地检查一下 如果队列已满 我需要处理队列中的每个项目 队列中的每个项目必须由单个进程处理 多处理 到目前为止 我设法 手动 实现这一点 如下所示 while 1 self
  • 带有组合 API 的 Vue 3 事件总线

    我已经设置了mitt并尝试将事件分派到另一个组件 但我遇到了困难 因为在setup 它没有的方法this用于访问应用程序实例 这是我尝试过的 import App from App vue const el document getElem
  • 了解用于函数调用的 auipc+jalr 序列

    我试图阅读RISC V生成的程序集gcc我发现gcc创建序列auipc jalr对于某些函数调用 我不明白它是如何工作的 这是一个简单的例子 考虑以下C源文件 unsigned long id unsigned long x return
  • 如何重命名数组中对象的键

    如何用另一个元素替换数组元素值 我有这样的数组 不使用 jquery this products text prod1 value 1 text prod2 value 2 text prod3 value 3 我想将 文本 替换为 标签
  • Qt。自动添加应用程序版本

    In a pro文件 我可以设置应用程序的版本 例如 VERSION
  • 如何在 Android 中使用一台相机创建多个镜头或预览

    我想创建像上面这样的东西 三个盒子 就像相机预览一样 关于做什么的任何想法或概念 我尝试获取相机的实例并将其放置到三个相机预览对象中 但我收到一条错误消息 我想这是不允许的 这是我的代码 private CameraPreview mPre
  • WCF 和多个命名空间的问题 - 跨多个服务引用共享对象类型

    我有两个网络服务 一种具有用户功能 一种具有管理功能 这两种服务都可以有效地使用相同的对象类型 例如 AdminService 提供删除 修改 Customer 对象的功能 UserService 提供列出 读取 Customer 对象的功
  • 如何在工具提示中自动换行文本

    如何对需要出现在工具提示中的文本进行自动换行 看起来不直接支持 如何对显示的工具提示进行自动换行 这是一种使用反射的方法 实现这一点 DllImport user32 dll private extern static int SendMe
  • Java 中的“using”指令

    当类型名称太长时 在 C 中我可以创建如下别名 using Dict System Collections Generic Dictionary
  • 编译jruby“Hello world”问题

    我使用 Ruby 编程已经有一段时间了 我真的很喜欢它 最近我开始需要编译一些 ruby 代码 由于多种原因 使用 Ruby2exe 对我来说不是一个选择 所以我决定尝试一下 Jruby 生成一个 jar 就足够了 我使用的是 Window
  • Google Chrome 扩展程序中有多个后台脚本?

    我的任务是创建一个 Google Chrome 扩展程序 到目前为止 一切正常 但是 我希望能够使用多个后台脚本 我的意思是 background scripts background js 如果我所说的不清楚 而不是创建多个扩展 这可能吗
  • npm install 不安装任何依赖项

    我正在尝试安装软件包package json文件 不幸的是 当我跑步时npm install 什么也没有发生 没有安装任何东西 我用过npm install在其他存储库上并且它可以成功运行 这是我的路径 PATH Users me rben
  • Ruby 中使用 net-sftp 进行基于密钥的身份验证

    我希望能够使用 SFTP 登录多个服务器并下载某些文件 以帮助在问题出现时进行调试 虽然我们可以使用客户端 但我们希望开始自动化流程以简化一切 我的第一次尝试看起来像这样 def download files to download des
  • 通过比较行中的列来过滤 Pandas DataFrame

    我的数据框中的每一行都有两个日期列 如何过滤掉 日期 A 在 日期 B 之后的行 例子 symbol reports at as of signal A 2012 02 15T21 00 00Z 2012 02 01T12 00 00Z 6
  • 强制可选参数使用更广泛的类型,并具有更严格的默认值

    有没有办法进行可选参数f足够灵活 有类型 a gt b 但仍将其默认为identity 鉴于identity有类型 a gt a 之前的一个问题 begins通过准确地陈述我的问题 我想定义一个接受可选参数的函数 该参数是 一个函数 a g
  • 语音中的关键字识别[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 有谁知道有一个免费的关键字识别系统 并且可能提供 API CMU Sphinx 4 和 MS Speech API 是语音识别引擎 不能用于 KWS
  • 在 Java 的 main() 中对 Thread 实例运行 wait()

    我正在尝试 java lang Object 中 wait 的定时版本 并观察到它在两种不同场景中的行为有所不同 场景1 使用Thread中run 的默认定义 public static void main String args thro