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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 飘落 中级黑马   /  2013-10-9 23:14  /  1548 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 飘落 于 2013-10-10 11:00 编辑

在一个有多线程的程序中,main线程的代码执行完毕时,还有其他线程在运行,
那么这时main线程结束了吗?
如果结束了,为什么其他线程还能运行?
如果没有结束,main线程处于什么状态?

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

3 个回复

倒序浏览
本帖最后由 横塘西岸 于 2013-10-10 00:44 编辑

main线程结束了那它里面的线程肯定也结束了,所以不用担心其它线程还没来得及结束,再说了main都结束被杀掉了,它里面的内容怎么还会执行下去。下面这个是Java文档中的原话“每个线程都可以或不可以标记为一个守护程序。当某个线程中运行的代码创建一个新 Thread 对象时,该新线程的初始优先级被设定为创建线程的优先级,并且当且仅当创建线程是守护线程时,新线程才是守护程序。
当 Java 虚拟机启动时,通常都会有单个非守护线程(它通常会调用某个指定类的 main 方法)。Java 虚拟机会继续执行线程,直到下列任一情况出现时为止:
  • 调用了 Runtime 类的 exit 方法,并且安全管理器允许退出操作发生。
  • 非守护线程的所有线程都已停止运行,无论是通过从对 run 方法的调用中返回,还是通过抛出一个传播到 run 方法之外的异常。”
因为进程间CPU时间分配是不确定的,对main里面的线程可采用new Thread.join()方法等待它执行完毕

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
      理论上说,main函数返回后,进程终止,其它线程不能继续执行。进程结束后,进程所产生的线程一定不会继续运行,因为线程就是运行在进程的地址空间的。
      但是还有另一种情况,一个新线程在main里,但用的是不同的调用堆栈,main本身结束,不影响新调用堆栈的继续执行。因为main函数只是程序的入口,是一个程序中多条线程的其中一条。独立的线程间是互相不影响的,即便main线程结束了,其他独立的线程依然会照常运行。

评分

参与人数 1技术分 +1 收起 理由
周志龙 + 1

查看全部评分

回复 使用道具 举报
To 金牌黑马 2013-10-10 10:51:46
板凳
楼主你好,如果问题已解决,请将帖子状态改为提问结束,如果没有解决请楼主继续提问,谢谢合作
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马