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中的一些知识,感谢