A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

本帖最后由 2528870651 于 2014-4-4 18:46 编辑
  1. class  ThreadDemo implements Runnable
  2. {        
  3.         public  void run()
  4.         {               
  5.                 int i=0;
  6.                 while(true)
  7.                 {
  8.                         System.out.println("i======="+i++);
  9.                 }
  10.         }
  11. }

  12. class Test
  13. {
  14.          public static void main(String[] args)
  15.                         {
  16.                                 ThreadDemo t = new ThreadDemo();
  17.                                 Thread a = new Thread (t);
  18.                                 a.setDaemon(true);
  19.                                 if(a.isDaemon())
  20.                                 {
  21.                                         a.start();
  22.                                        
  23.                                 }
  24.                                 System.out.println("over");  //按照我的理解 输出over后主线程就结束了,而非守
  25.                                                                   //护线程结束后守护现场就不会执行了啊,可是在
  26.                                                                  //执行的时候却是在over后 守护线程还执行了一次
  27.                                                                 //所以我想问主线程到底在哪个位置结束????
  28.                            
  29.                         }
  30. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 神马都是浮云

查看全部评分

10 个回复

倒序浏览
当程序输出over时,主线程就结束了,但是jvm不会立即退出,它还会检查有没有其他的用户线程存在,以至于是否退出,这个空隙守护线程还是可以运行的。
我跑了下你的代码,结果发现i可以跑到1700,
public  void run()
        {               
                int i=0;
                while(true)
                {
                        Thread.sleep(20);
                        System.out.println("i======="+i++);
                }
        }
在每次循环间加一点间隔时间,会发现I值会随着时间的增大,而减小,也验证我上面的结论。主线程结束后,jvm不会立即退出,守护线程还可以在主线程结束与jvm退出这个时间段运行。个人结论,仅供参考。

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
这个就是传说中的 主线程 有执行资格,却没有抢到cpu的执行权,守护线程抢到了一直运行
回复 使用道具 举报
输出over后主线程就结束,JVM退出需要时间,在退出前,守护线程执行了一次。
回复 使用道具 举报
输出over后并没有结束,准确的说是执行完30行的 } 后,才结束,中间一个时间间隙,在这个间隙内,恰好被子线程抢夺到CUP执行权,子线程中循环多几次很正常。
其实这个结果是不确定的,不能说明什么。
可能是输出over后,守护子线程中的循环一次也没执行就退出JVM了;
也可能先输入over后,执行了好几次守护子线程中的循环体,然后才退出JVM;
还可能先执行了几次守护子线程中的循环体,然后输出over,然后又执行了执行了几次守护子线程中的循环体再退出JVM。

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 2528870651 于 2014-4-1 22:04 编辑
ehuashao 发表于 2014-4-1 16:59
当程序输出over时,主线程就结束了,但是jvm不会立即退出,它还会检查有没有其他的用户线程存在,以至于是 ...

谢谢  !   我再去试试看看是不是这样。
我验证的时候 没有设置true 而是i<10  可能复制的时候是前面复制的  所以只执行了一次
哥们你确定你能得到的i值可以上千???  
Thread.sleep(20);   //这里会报错呢    未报告的异常interruptedException



回复 使用道具 举报
osully 发表于 2014-4-1 17:09
这个就是传说中的 主线程 有执行资格,却没有抢到cpu的执行权,守护线程抢到了一直运行 ...

哥们 ,可是 主线程结束了啊 ,它还要抢cpu执行权干嘛??
能不能说的详细一点 啊。。。。。
回复 使用道具 举报
xietansheng 发表于 2014-4-1 17:47
输出over后并没有结束,准确的说是执行完30行的 } 后,才结束,中间一个时间间隙,在这个间隙内,恰好被子 ...

:)谢谢你的回答!!
回复 使用道具 举报
2528870651 发表于 2014-4-1 21:26
哥们 ,可是 主线程结束了啊 ,它还要抢cpu执行权干嘛??
能不能说的详细一点 啊。。。。。 ...

不说意思不好意思
说的具体点
就是java 虚拟机 本身也是多线程,主线程就是其中一个,还有垃圾回收机制线程...
应该说是java虚拟机的其他进程没抢到 cpu执行权
这就完美了吧
回复 使用道具 举报
能否回答main线程是在over后面的”;“结束  ,  还是在”}“结束啊 !!    好像有2个答案不同,有个人说是”;“有一个人说是”}“ ,到底是哪一个呢
回复 使用道具 举报
2528870651 发表于 2014-4-1 21:25
谢谢  !   我再去试试看看是不是这样。
我验证的时候 没有设置true 而是i

Thread.sleep()方抛出异常就可以了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马