Java线程问题

时间:2011-04-04 16:31:45

标签: java

我正在上Java课程。我们现在进入线程。这是我第一次体验多线程,所以如果问题非常愚蠢,请原谅我:)

我有以下计划:

public class Foo extends Thread {
    private int x = 2;

    public static void main(String[]args) {
        new Foo().fun();
    }

    Foo () {
        x = 5;
        start();
    }

    public void fun() {
        x = x - 1;
        System.out.println(x);
    }
    public void run() {
        x = x * 2;
    }
}

当我运行程序时,我得到4作为输出。上述程序的输出总是4吗?

5 个答案:

答案 0 :(得分:4)

它永远不会是4。

如果在主线程运行fun()之前执行Foo run()方法,它将为9。

如果在main运行fun()时执行Foo run()方法,它将为8。

如果main()在Foo启动之前完成,那么它将是4

答案 1 :(得分:2)

不,不总是。因为在您调用start()方法时,从主线程调用funrun之间存在竞争条件,这将改变x的值Thread.start。< / p>

但是,实际上,如果没有正确的同步,就不能保证输出将是什么,与调用funrun的顺序无关。由于同步可确保线程更改的可见性,因此即使runfun被调用之前完成,输出也可为4。

答案 2 :(得分:0)

正如您所说,您正在学习多线程,您必须知道您永远无法预测不同线程的执行顺序。

这是一个非常简单的程序,其中主线程几乎总是首先完成 - 但重要的是要记住,在复杂的多线程场景中你永远无法确定。实际上,您选择多线程方法主要是在一个线程不依赖于另一个线程的执行的情况下。

顺便尝试以这种方式更改构造函数:

Foo () {
        x = 5;
        start();
        Thread.sleep(2 * 1000);
    }

你可能得到不同的结果。

答案 3 :(得分:0)

警告{p> Simon's answer是正确的。 Java有一些变量值的缓存。如果变量未设置为volatile或者您不使用原子值,则可能会获得缓存值而不是最新值。

答案 4 :(得分:-2)

是的,它永远是4.我认为没有理由不是4

您只能fun()而不能run()

阅读java Thread man