当前位置: 首页 > 知识库问答 >
问题:

Java thread.yield()奇怪的行为

籍利
2023-03-14
  class MyThread extends Thread{
    public void run(){
        for (int i = 0; i<=10; i++){
            System.out.println("Child Thread");
            Thread.yield();
            
        }
    }
}
  public class TestYield {
    public static void main(String[] args) {
        MyThread obj = new MyThread();
        obj.start();
        for (int i = 0; i<=10; i++){
            System.out.println("Main Thread");
        }
    }
}
Main Thread
Main Thread
Main Thread
Main Thread
Main Thread
Main Thread
Child Thread
Main Thread
Main Thread
Main Thread
Main Thread
Main Thread
Main Thread
Main Thread
Main Thread
Main Thread
Main Thread
Main Thread
Child Thread
Child Thread
Child Thread
Child Thread
Child Thread
Child Thread
Child Thread
Child Thread
Child Thread
Child Thread
Child Thread

所以我更新了代码,添加了行thread.sleep((long)0.1);所做的是将主线程置于Hibernate状态一段时间,因此jvm可以获得一些时间来创建一个新线程。我正在得到我的预期输出

Main Thread
Main Thread
Main Thread
Child Thread
Main Thread
Main Thread
Main Thread
Main Thread
Main Thread
Main Thread
Main Thread
Main Thread
Child Thread
Child Thread
Child Thread
Child Thread
Child Thread
Child Thread
Child Thread
Child Thread
Child Thread
Child Thread

共有1个答案

莘聪
2023-03-14

1-主线程太快了,以至于子线程还没有启动(或启动完)-可能main中的yield最终会帮助子线程获得运行的机会。(并从10增加到100或更多次迭代)

2-yield不保证另一个线程将运行(文档中:“The scheduler is free to ignore this hint”)由于在main中没有yield,因此不太相关

3-检查java.util.concurrent.locks包。
实际上,yield文档还声明“使用此方法很少合适。”

 类似资料:
  • 我有以下代码来解析一个JSON文件: 要处理以下JSON文件: 如果我执行此代码,我将收到以下错误: 所以我开始一步一步地调试应用程序,看看part processing()中的哪个代码部分抛出了这个异常。令人惊讶的是,那里的所有代码都正常执行:没有抛出异常,也没有返回结果I except。 更让我惊讶的是,当我稍微改变第一种方法的代码时,它可以在不产生异常的情况下工作。 我不知道println方

  • 问题内容: 我在GregorianCalendar类中遇到一个奇怪的行为,我想知道我是否真的做得不好。 仅当初始化日期的月份的实际Maximum大于我将日历设置为的月份时,才追加此值。 这是示例代码: 我知道问题是由于日历初始化日期是31天(可能是5月),与设置为2月(28天)的月份混淆了。修复很容易(只需在设置年和月之前将day_of_month设置为1),但是我想知道这确实是想要的行为。有什么

  • 问题内容: 我正在为一个问题而苦苦挣扎,我不明白为什么它不起作用。如何通过将变量传递并转换为? 为什么在顶部代码段中不起作用,但在行下方的底部代码段中起作用? 唯一的区别似乎是添加了一个额外的变量,该变量也被键入为? 问题答案: 该是一种原始类型,同时是一个普通的Java类。您不能在原始类型上调用方法。但是该方法在上可用,如javadoc中所示 有关这些原始类型的更多信息,请参见此处

  • 问题内容: 为什么的到哪里去了? 问题答案: 删除任何字符,并从字符串的开头和结尾。

  • 问题内容: 我认为这是一个正常程序,但这是我得到的输出: 有人可以向我解释一下吗? 问题答案: 这是有据可查的PHP行为,请参阅php.net的foreach页面上的警告。 警告 即使在 foreach 循环之后,仍保留 $ value的 引用和最后一个数组元素。建议通过unset()销毁它。 __ 编辑 尝试逐步了解此处实际发生的情况

  • 问题内容: 我有上面的代码,但我不知道为什么会产生 而不是 非常感谢 问题答案: 使用量词来匹配1个或多个空格,而不是:- 表示匹配0个或多个空格,并且将在每个字符之前匹配一个空字符,并由一个空格代替。

  • 我正在Glassfish 4.1上制作一个Java EE 7应用程序(war) 该应用程序是一个简单的CRUD应用程序 为了测试CRUD操作,我制作了一个Java SE客户端(使用Jersey2客户端api)。奇怪的行为是HTTP POST创建没有检测到对象的一个字段: 我有一个“birthDate”属性,它在服务器端总是为“null”<我不明白为什么会发生这种情况以及如何解决? 以下是我在服务器

  • 我在用C来解决这个问题。 代码是使用编译的。 整个解决方案都在github上。存储库包含两个cpp文件:main。cpp和哲学家。cpp。“Main.cpp”创建互斥变量、信号量、5个条件变量、5个分叉并启动。信号量仅用于同步开始时间。其他参数被传递给哲学家来解决问题。“哲学家.cpp”包含给定问题的解决方案,但经过几个步骤后,死锁就会发生。 当哲学家0正在吃饭,而哲学家1(在他旁边)想要拿叉子时