黑马程序员技术交流社区

标题: 主线程和其它线程的执行顺序 [打印本页]

作者: 李东城    时间: 2013-2-15 18:05
标题: 主线程和其它线程的执行顺序
  1. class Demo extends Thread
  2. {
  3. public void run()
  4. {
  5. for(int x=0; x<60;x++)
  6. System.out.println("demo run="+x);
  7. }
  8. }
  9. class ThreadDemo
  10. {
  11. public static void main(String[] args)
  12. {
  13. Demo d = new Demo();
  14. d.start();

  15. for (int x=0;x<60 ;x++ )
  16. System.out.println("Hello World!="+x);
  17. }
  18. }

复制代码
在开始讲多线程视频当中,有上面一段代码,运行以后主线程和继承Thread会出现交替运行的情况。

但是我有一个问题,如果Demo不集成Thread的话,把d.start();改成d.run();会先循环demo run,执行完毕之后,在运行主函数的循环,这个没有问题,因为先执行的d.run();

可是如果,按现在的代码,我运行了10几次,都是hello world+0先执行,最少执行一次,才会去执行另外一个线程,这是为什么?不应该按照代码的顺序先执行Demo中的循环么?

作者: jonn    时间: 2013-2-15 18:12
d.start() 自动调用的run(),若你调用run也行,不过不是多线程了概念了,直接是方法调用,建议去看Thread 源代码..这里应该间接实现接口,直接是 利用底层实现,执行过程调用操作系统c /c++ 汇编的函数库实现
作者: 罗海云    时间: 2013-2-15 20:43
d.start 假如改为d.run的话就不是多线程了.就相当于调用了一个那个类里面的run方法. java执行线程的顺序. 都是先执行主函数, 其他线程交替.cpu执行其实还是单线程. 只是cpu切换线程速度太快, 毕老师视频里讲的很明白.
作者: 刘琦    时间: 2013-3-9 20:50
额,这个是必须的,这个可以参考Thread的源码,其实你在运行其他线程之前,创建的最早的线程是main,而不是别的你自己创建的线程,即使你没创建线程,man也会自动运行。main 可以说是程序运行的源头




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