【问题标题】:Java class implements Runnable, creates new thread, then returns strange results. Why?Java 类实现 Runnable,创建新线程,然后返回奇怪的结果。为什么?
【发布时间】:2016-06-24 03:43:09
【问题描述】:

我正在学习 Java 和它的怪癖。这是怎么回事?

public class myThread implements Runnable {

    String msg = "yes";

    public void run() {
        this.msg = "No";
    }

    public static void main(String[] args) {
        myThread one = new myThread();
        (new Thread(one)).start();

        for (int i = 0; i < 10; i++) {
            System.out.println(one.msg);
        }
    }
}

结果:是的 不 不 不 不 不 不 不 不 没有

为什么第一个结果返回为“是”,然后将其设置为“否”?

【问题讨论】:

  • 当你从printlnprint 时它会改变吗(这样缓冲区不会被刷新并且I/O 被延迟)?

标签: java multithreading runnable java-threads


【解决方案1】:

因为start() 开始新线程和修改msg 花费了稍微多一点的时间,所以在线程开始之前完成了一个循环迭代。第一次迭代后,msg已经被线程修改,显示No

【讨论】:

    【解决方案2】:

    您的新线程在后台运行,而主线程继续运行。

    两者之间没有同步,因此后台线程会在完全未指定的某一点将值从“yes”更改为“no”。与此同时,主线程只是打印它在这个时间点看到的内容。

    如果我正确理解 Java 内存模型,在没有任何 synchronizedvolatile 或其他同步构造的情况下,甚至不能保证主线程完全看到其他线程的更改 em>。

    【讨论】:

      【解决方案3】:

      您已经创建了一个新的Thread 并调用了start() 方法来开始它的执行。但是 JVM 决定线程何时运行。每次运行程序都会得到不同的结果。

      首先你会得到yes,然后是No。主线程首先打印yes,然后JVM启动子线程,它改变了msg的值,然后控制回到主线程并将msg打印为No直到循环结束。

      【讨论】:

      • "每次运行程序都会得到不同的结果。" - 这不是真的。我运行了 100 倍,每次都返回相同的结果。
      猜你喜欢
      • 2012-11-02
      • 2016-09-02
      • 1970-01-01
      • 2020-02-28
      • 1970-01-01
      • 2019-12-11
      • 2019-06-29
      • 2019-02-04
      • 1970-01-01
      相关资源
      最近更新 更多