以下代码输出如下。为什么,主线程return早已结束,子线程还不结束吗?我是老师,现在的和:1
我是学生,现在的和:2
我是老师,现在的和:3
我是学生,现在的和:4
我是老师,现在的和:5
我是学生,现在的和:6
我是老师,现在的和:7
我是学生,现在的和:8
我是老师,现在的和:9
我是学生,现在的和:10public class Example9_2 {
    public static void main(String args[]) {
     ComputerSum sum = new ComputerSum();
     People left = new People("老师", 1000, sum);
     People right = new People("学生", 1000, sum);
     left.start();
     right.start();
     return;
    }
}class ComputerSum {
int sum;
public void setSum(int n) {
sum = n;
}
public int getSum() {
return sum;
}
}class People extends Thread {
int timeLength; //线程休眠的时间长度
ComputerSum sum;
People(String s, int timeLength, ComputerSum sum) {
setName(s); //调用Thread类的方法setName为线程起个名字
this.timeLength = timeLength;
this.sum = sum;
}
@Override
public void run() {
for (int i=1; i<=5; i++) {
int m = sum.getSum();
sum.setSum(m + 1);
     System.out.println("我是" + getName() + ",现在的和:" + sum.getSum());
     try {
     sleep(timeLength);
     }
     catch (InterruptedException e) {
     }
     }
    }
}

解决方案 »

  1.   

    你的子线程是由main线程来调用的  main线程结束 子线程也就不存在了
     
    并非他们要同时结束  比如有的时候 子线程遇到阻塞  或者需要认为的休眠 这个时候main线程还在。
      

  2.   

    jvm会在所有非守护线程结束运行后结束,不会管守护线程的死活,其结果就像上面说的,如果所有子线程都是守护线程,那么主线程一结束子线程也都结束了
      

  3.   

    你的这两个线程都不是守护线程。
    或者说,它们和程序开始起始线程(调用main方法的线程)是并列关系。只是,它们是由起始线程调用启动的而已。启动之后,它们三个就没有关系了。
      

  4.   

    "你的子线程是由main线程来调用的 main线程结束 子线程也就不存在了"
    这理论谁教你的?
      

  5.   

    main的线程退出了,其他线程都是浮云了。
    所以,在main中起了线程,需要join一把 等其他线程返回后main最后退出。
      

  6.   

    在Java里面Main线程只是一个非常普通的线程,也其它的非守护线程是同样的地位。main退出不代表其它线程需要结束的。JVM是判断所有非守护线程都结束才认为需要退出。
      

  7.   


    请问你一下   没有main线程  其他的线程能自动运行起来么?你有理论就说出来让大家学习学习 别就一句话   还以为你好大水平呢     有点砸人...
      

  8.   


    我先声明一点    main线程结束 子线程也就不存在了    是错的 ...
      

  9.   

    你换个角度想就不会发表你针对我的感叹了,main线程结束,子线程也就不存在了。针对用错误理论来教导别人的人来说,我一向是非常愤怒的,没别的意思,提醒的是要对自己说的话负责。
      

  10.   

    1.main所在的线程结束,和其它子线程是否结束没有任何关系。
    2.main所在的线程结束,demon线程是否退出也和它没有任何关系,而是看整个jvm进程内是否还有非
    demon线程,如果没有,整个jvm进程退出。换句话说jvm只要发现不再有非demon线程就退出,main线程是否退出没有任何关系。所以说上面两个完全胡说八道,而且我说他们胡说八道,也不是非要说明理由,如果有人说1+1=10我要说明理由说他们胡说八道吗。
      

  11.   

    说jvm随主线程退出是因为lz给的这个例子如果子线程都设为daemon的话就只有主线程一个非daemon线程了,属于特例,上面后来也说过的你说1+1=10胡说八道人家会告诉你这是2进制的
      

  12.   

    虽然说线程是由主线程创建的,但是线程之间并没有父子关系,对 CPU 而言所谓的主线程和子线程没有任何区别,并不存在谁控制谁的问题。一个进程中只要有一个非守护线程在运行的话,那么这个进程或者说程序就不会结束掉。
      

  13.   


    对于你的回复 我表示压力很大!首先我不是在教导别人 我只是在说出我个人的观点  如果错了 大家可以相互探讨 这本来就是一个相互探讨的平台  你愤怒我做什么呢?
    其次我感觉你真的 N X  你肯定一向都是很N X的人 从来不说错话  做错事   了不起...
      

  14.   

    即便你坚信“main线程结束 子线程也就不存在了”是正确的,我也不会信的。因为,代码运行的实际效果已经否定它了。
      

  15.   

    反过来,如果我没有指正,也许你的这个错误观点会被楼主采纳并且错误的思考下去,我愤怒之处是因为我见过太多csdn上不负责任的回复了,并且你自己本身就知道这个错误观点,难道不能再发表回复的时候,重新检查自己所写的话!
    在我最初学习java的时候,我得引路人告诉我,可以去csdn上提些问题,但是自己必须具备分辨正确和错误回复能力,现在自己在这方面略懂一二了,只是想让那些初学者能够学到正确的东西少走弯路,这是我得出发点!
    我再次强调我之所以愤怒的根本是    我在csdn上见过太多错误的不负责任的回复 我不是针对你 只是针对这种现象而愤怒 所有人都负起责任 这个论坛才有价值 。我承认我得 第一句回复 “。。理论谁教你的”这话的确不妥 可以换种方式来说 也许你会接受 只是因为见到太多不负责任的回复 才会这样 为此我表示歉意 希望今后你和所有人都能负起自己的责任 把好东西留在论坛 我只是一个路人 一个工作休息时上来 逛下的人 我只是对自己负责!
      

  16.   

    主线程结束子线程并不会结束, 如果你想子线程在main线程前结束,可以将线程设为守护线程或者利用join方法。
      

  17.   

    可以来这里发表你的看法,我单独开了一个帖子。
    http://topic.csdn.net/u/20110506/16/94776d9f-5d8f-4964-affe-34830fd22962.html
      

  18.   


    你才傻X  .好好想想你的比喻吧 你说别人在瞎说 你就没瞎说  我也不想在这个问题上纠结了  
    只想告诉你  不要针对那一个人发表不满 毕竟我们还没那么熟 所以你还没那个特权  特别是过分那种  这样你到是没什么... 人与人之间要相互尊重 大家都是求学的 你能说你有好NB
      

  19.   

    什么子线程父线程的,我估计楼主要说的是后台线程和非后台线程吧!因为main是非后台线程如果你用setDaemon(true)方法把主线程所创建的线程设置成后台线程的话,当所有的非后台线程都结束了,如果非后台线程还没有结束的话,所有的非后台线程就会被强制终止,甚至连InterruptedException异常都不会抛出和finally子句都不会执行,这种方式的确很不优雅,但有时的确很需要!但是如果你没有调用setDaemon(true)方法,对不起,他就会创建一个和main一样非后台线程,但这两个线程神马关系都没有,main线程的结束不会影响到他所创建的非后台线程,这就是为神马楼主说main线程结束了,而所创建的非后台没有结束的原因!详细讲解请参见《Java编程思想》中“并发”这章的“后台线程”这节!