黑马程序员技术交流社区

标题: 关于多线程和System.exit()的问题 [打印本页]

作者: 广驰    时间: 2012-8-25 16:31
标题: 关于多线程和System.exit()的问题
  1. class Demo extends Thread
  2. {
  3.         private String name;
  4.         Demo(String name)
  5.         {
  6.                 this.name = name;
  7.         }
  8.         public void run()
  9.         {
  10.                 for(int x= 0;x<10;x++)
  11.                 System.out.println(name+"run"+x);
  12.                 System.exit(0);
  13.         }
  14. }

  15. class Test
  16. {
  17.         public static void main(String[] arges)
  18.         {
  19.                 Demo d1 = new Demo("1");
  20.                 d1.start();
  21.                 Demo d2 = new Demo("2");
  22.                 d2.start();
  23.                 Demo d3 = new Demo("3");
  24.                 d3.start();
  25.                 Demo d4 = new Demo("4");
  26.                 d4.start();
  27.         }
  28. }
复制代码
System.exit(0)执行之后不是应该整个程序都停止了么,可是为什么结果确实一个线程结束后,另一个线程还要循环几次才结束呢,
1run0
2run0
2run1
2run2
2run3
2run4
2run5
2run6
2run7
2run8
2run9
1run1
1run2
1run3
1run4
1run5

这个是其中一次的运行结果,按说应该执行到2run9程序就结束了,为什么后面还执行到了1run5呢
麻烦又哪位知道了指教一下!!谢谢

作者: 李敬    时间: 2012-8-25 16:43
本帖最后由 李敬 于 2012-8-25 16:45 编辑

执行完2run9也不一定就一定先执行System.exit(0),可以执行其他的线程,然后又回到本线去执行System.exit(0)的

作者: 广驰    时间: 2012-8-25 16:53
李敬 发表于 2012-8-25 16:43
执行完2run9也不一定就一定先执行System.exit(0),可以执行其他的线程,然后又回到本线去执行System.exit(0) ...

呃,一时没想到,反而纠结了,没想到确实很简单
作者: 刘源    时间: 2012-8-25 16:54
因为你是多线程运行,所以你不能保证,那个线程执行到System.exit(0)。他完全有可能执行下这个线程之后就换下个线程了。
如果你只是想验证System.exit(0)之后,还有没有其他线程在执行,那么你只需要将他们要执行的代码同步就OK了。
这样你虽然开启了4个线程,但肯定是一个线程执行完之后,才能执行下一个线程,但是,这个线程会执行到System.exit(0),那么程序就停掉了,下一个线程就不会执行。
结果就是,每一次都会打印一个线程,但不知道是哪个线程优先抢到资源。
作者: 广驰    时间: 2012-8-25 17:01
已解决!!谢谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2