yueye2030 2011-03-23 17:53
浏览 184
已采纳

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

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

3条回答 默认 最新

  • tiandidapengniao 2011-03-23 17:53
    关注

    当线程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已经开始运行并很快就结束,所以会出现那种情况。线程调度是由操作系统进行的,具有不确定性。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题