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!了呢?
求解....
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!了呢?
求解....
在returnThreadInfo.start();后,非Main线程会去在一定时间内,执行对应的run方法,所以当你没有用FOR循环时Main线程会继续往下执行,非Main线程还没有执行对应的Run方法,就导致结果为Hello,反之,当用了for循环,Main线程会执行一段时间才会执行完,当For循环对应的内容执行完了可能非Main线程也执行完了对应的run方法,这时再打印结果当然就为HelloWorld了,说得很乱,希望能帮助到LZ
其实应该这么说
Main线程启动之后,在Main方法里又启动一个线程之后,由于Java里面针对多线程是各个线程去抢占CPU使用时间的,也就是说在任意时间段两个线程都有抢占使用CPU的权力,在没注释FOR循环之前,Main线程在执行For循环内容的过程中,可能有基本个时间段CPU被returnThreadInfo线程给抢占了,这时str就为HelloWorld了,所以打印结果为HelloWorld,反之就是在线程的Start方法里,由于也要隔一定时间才会去执行Run方法(Start里面有代码要执行),在这时间段CPU使用时间被Main线程给抢占继续执行下述代码就会打印出Hello,不过这打印的结果也不是绝对的.
我也同意这位同志的说法。。
多线程问题是一个比较复杂的问题。。
在抢占CPU的时候谁也不知道到底是哪个线程抢占到了。。
所以打印出来的结果也是有很多种情况的。。
如果你想要人为ide控制结果的输出的话 可以使用sleep方法。。
但是在Main线程加个循环的话,
在run方法调用之前,Main线程就在做那个循环了。
run方法调用后,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
多谢了昂。