public class XianChen1 {    public XianChen1() {
    }
    
    public static void main(String []arg){
     MyThread r=new MyThread();
     Thread t=new Thread(r);
     t.start();
     for(int i=0;i<5;i++)
     {
     System.out.println("Bb");
     }
    }
}class MyThread implements Runnable
{
int j;//为什么不用初始化j=0;
public void run()
{
while(true)
{
System.out.println("Aa"+j++);
if(j==3)
{
break;
}
}
}
}
代码运行能出三种结果.
第一种:
Bb
Bb
Bb
Bb
Bb
Aa0
Aa1
Aa2Process completed.
第二种:
Bb
Aa0
Bb
Aa1
Bb
Aa2
Bb
BbProcess completed.
第三种:
Bb
Bb
Aa0
Bb
Aa1
Bb
Aa2
BbProcess completed.这三种情况是随机出现的,请问为什么程序运行会出现这样的不确定性?另外j为什么不用初始化为0?

解决方案 »

  1.   

    LZ去看看多线程吧
    java中,所有类型都有默认值的,j是int所以默认是0
      

  2.   

    我正在看多线程从而提出了这个问题
    “java中,所有类型都有默认值的,j是int所以默认是0”,你说的是java中,为什么下面这个代码会有一个编译错误public class uninit {    public uninit() {
        }
        
        public static void main(String []arg){
         int j;
         System.out.println(j);
        }
    }
      

  3.   

    线程的优先级相同时执行顺序是不确定的。你可以通过指定优先级来控制顺序。
    第二个问题,对于class处的基本型变量系统会给定一个默认的初值。但对函数内部的不会。
      

  4.   

    多线程没有顺序一说,所以有锁的概念在里面
    java中,所有类型都有默认值的,j是int所以默认是0是值变量是成员变量,可你把j放到局部变量就不行了
      

  5.   

    你这里是方法里面定义的临时变量啊,所以要初始化。类的域是指类的属性值,所有的类的属性值都会有一个默认的值(比如一个引用的话就默认是null)。至于为什么线程运行出现的不确定性,这个和操作系统选择线程的机制有关(优先级啊什么的),是java控制不了的,但是你可以通过线程同步来满足你的执行顺序。