将创建多少个线程?

时间:2013-06-28 17:15:41

标签: java

public class ThreadTest extends Thread
{
    int i=0;

    public void run()
    {
        i=1;
    }

    public static void main(String... args)
    {
        ThreadTest tTest=new ThreadTest();
        tTest.start();

        System.out.println(tTest.i);
    }
}

为什么有时打印1,有时打印0?在这个程序中会创建多少个线程?据我了解,这个程序中将创建2个线程。如果我错了,请纠正我。

3 个答案:

答案 0 :(得分:10)

你有竞争条件。有时主线程获胜,有时测试线程获胜。

程序中有2个线程,其中只有一个由程序实例化。主线程由jvm创建,并正在执行main()方法。然后你的代码实例化一个测试线程并执行它。

答案 1 :(得分:3)

程序代码启动一个线程。 JVM本身启动了几个:主线程,GC线程等。

输出可以是0或1,因为System.out.println行可能在i=1行之前或之后执行。您绝对不能保证,因为没有使用同步。并且由于共享i变量由两个线程访问而没有任何类型的同步,即使在另一条指令之前执行i=1,主线程仍然可以看到0作为{{1}的值}。

这是非常复杂的东西,如果你真的想要理解Java中的并发性,你应该读一本关于它的好书,例如Br​​ian Goetz的 Java inurrency

答案 2 :(得分:2)

两个应用程序线程

  • “主要”主题

  • 由tTest.start()

  • 启动的那个

我猜测程序sometines打印0,有时打印1作为线程调度的结果。有些主线程在tTest线程进入run方法之前会到达System.out.println语句,有时它不会。