关于线程的一个问题(新手)

public class Test{
static class Thread1 implements Runnable{
        int sum=0;
        public void run(){
            for(int i=1;i<=10;i++){
                sum+=i;
            }
        }
}
 public static void main(String[] args) throws InterruptedException{
        Thread1 f=new Thread1();
        Thread f1=new Thread(f);
        f1.start();
    //System.out.println(f1.isAlive());
    System.out.println(f.sum);
    System.out.println(f1.isAlive());

 
    }

}       

 

我想知道有何没有注释掉的那一句,结果为什么不一样,一个是0一个是55。

有的时候是:

true

55

flase

没有的时候是:

0

flase

新手帖,错误和不规范还是有的,希望前辈们不要介意。


问题补充
liupengtao 写道
当线程f1调用start方法启动线程后,该线程只是处于可运行状态(runnable),并不一定处于正在运行(running)的状态,此时有可能main线程获得到了cpu的执行权,所以Thread1中的run方法就不在运行,而此时调用sum时,sum还是为0.而之后f1获得了Cpu的执行权,运行Thread1中的run方法并且线程终止,之后main线程又获得了cpu的执行权,再次调用f1.isAlive时f1已经结束,所以返回false。这就是第二种情况的原因。而对于第一种情况,当调用System.out.println(f1.isAlive())时f1已经开始运行并很快就结束,所以会出现那种情况。线程调度是由操作系统进行的,具有不确定性。


了解,谢谢啊!你的回答让我想到了synchronized中的一些知识,感谢

当线程f1调用start方法启动线程后,该线程只是处于可运行状态(runnable),并不一定处于正在运行(running)的状态,此时有可能main线程获得到了cpu的执行权,所以Thread1中的run方法就不在运行,而此时调用sum时,sum还是为0.而之后f1获得了Cpu的执行权,运行Thread1中的run方法并且线程终止,之后main线程又获得了cpu的执行权,再次调用f1.isAlive时f1已经结束,所以返回false。这就是第二种情况的原因。而对于第一种情况,当调用System.out.println(f1.isAlive())时f1已经开始运行并很快就结束,所以会出现那种情况。线程调度是由操作系统进行的,具有不确定性。

这毕竟是两个线程(f1和主线程)并行执行,输出结果时可能计算完了,也可能还没算完。

执行这句代码的时候要花点之间,这个时候run()方法执行完了,所以能得到结果;
不加这句话run()还来不及执行(几乎还没开始),也就只能得到0。

但这个结果有不确定性,如果run里执行的时间长(如在run()该开始加一句Thread.sleep(1000)),那么两种写法的结果都是0;
反之,如果f1.start()后面加一句Thread.sleep(1000),得到的结果都是55。

很简单,55与0的不同与你是否注释没有任何关系

因为你启动的是两个线程,一个是main(主线程),一个是Thread1所在的线程

sum是存储在Thread1所在线程的一个变量

在两个线程同时跑的时候,sum这个变量会分别放在两个线程的线程变量里面(注意,是分别放在),jvm只保证A能看到的是A线程中的sum,B也同样

jvm在隔一段时间会做一个同步(不确定性)
由于你run方法中的
for(int i=1;i<=10;i++){

sum+=i;

}
运行周期会比较短,所以看到55的几率比较大,如果计算足够长,尝试测试足够多,会看到不同的结果(45.36等)