class ReturnThreadInfo extends Thread {
    private String str;     public ReturnThreadInfo() {
        this.str = "Hello";    }
    
    public void run(){
        try{
            this.str = "Hello World!";
        }catch(Exception ex){
            
        }
    }
    
    /*返回线程信息:str变量的值*/
    public String getThreadInfo(){
        return this.str;
    }
}
/////////////////
public class Main extends Thread {
    public static void main(String[] args) {
        ReturnThreadInfo returnThreadInfo = new ReturnThreadInfo();
        returnThreadInfo.start();
//for(int i=0; i<100;i++ ){ System.out.println(i); }
        System.out.println(returnThreadInfo.getThreadInfo());
    }
}
运行结果是输出Hello ,
但是为什么去掉注释(for循环)部分,输出的就变成Hello World!了呢?
求解....

解决方案 »

  1.   

    这个原因是由于你执行Main方法就相当于启动了一个线程,而你又在方法里开启了一个新线程,
    在returnThreadInfo.start();后,非Main线程会去在一定时间内,执行对应的run方法,所以当你没有用FOR循环时Main线程会继续往下执行,非Main线程还没有执行对应的Run方法,就导致结果为Hello,反之,当用了for循环,Main线程会执行一段时间才会执行完,当For循环对应的内容执行完了可能非Main线程也执行完了对应的run方法,这时再打印结果当然就为HelloWorld了,说得很乱,希望能帮助到LZ
      

  2.   

    刚说的可能有点不专业
    其实应该这么说
    Main线程启动之后,在Main方法里又启动一个线程之后,由于Java里面针对多线程是各个线程去抢占CPU使用时间的,也就是说在任意时间段两个线程都有抢占使用CPU的权力,在没注释FOR循环之前,Main线程在执行For循环内容的过程中,可能有基本个时间段CPU被returnThreadInfo线程给抢占了,这时str就为HelloWorld了,所以打印结果为HelloWorld,反之就是在线程的Start方法里,由于也要隔一定时间才会去执行Run方法(Start里面有代码要执行),在这时间段CPU使用时间被Main线程给抢占继续执行下述代码就会打印出Hello,不过这打印的结果也不是绝对的.
      

  3.   


    我也同意这位同志的说法。。
    多线程问题是一个比较复杂的问题。。
    在抢占CPU的时候谁也不知道到底是哪个线程抢占到了。。
    所以打印出来的结果也是有很多种情况的。。
    如果你想要人为ide控制结果的输出的话 可以使用sleep方法。。
      

  4.   

    那为什么去掉注释后,每次输出的都是Hello World!呢?郁闷...
      

  5.   


    但是在Main线程加个循环的话,
    在run方法调用之前,Main线程就在做那个循环了。
    run方法调用后,Main线程才执行打印语句。
      

  6.   

    最简单的解释就是 你用的是多线程main线程执行
    在没有加那个for循环的时候:
    System.out.println(returnThreadInfo.getThreadInfo());
    这个之前
    public void run(){
      try{
      this.str = "Hello World!";
      }catch(Exception ex){
        
      }
      }
    这个没执行完,str没被更新,所以打出来的是原来的
    但是你加了for 循环后在main线程执行System.out.println(returnThreadInfo.getThreadInfo());之前
    returnThreadInfo这个线程就有足够的时间去执行完run方法,所以打出来时 hello world
      

  7.   

     我又测试了下,即使不是一个for 100遍地循环,即使是个打印语句,只要加上后,打印的结果就都是Hello World!了 ,貌似有些眉目了。
    多谢了昂。