黑马程序员技术交流社区

标题: 关于主线程与继承Thread类线程执行顺序的问题 [打印本页]

作者: Chaiber    时间: 2012-12-7 10:27
标题: 关于主线程与继承Thread类线程执行顺序的问题
本帖最后由 Chaiber 于 2012-12-10 14:24 编辑

class Demo extends Thread
{
       public void run()
      {
           for(int x=0; x<60;x++)
           System.out.println("demo run="+x);
      }
}
class ThreadDemo
{
        public static void main(String[] args)
       {
            Demo d = new Demo();
            d.start();

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

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

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

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


作者: Rancho_Gump    时间: 2012-12-7 10:59
当执行到:d.start(); 后 便已经开启了一个线程,它和主线程共同抢夺CPU资源,在这句之后CPU运行哪个线程是不确定的,所以主线程和Demo线程都有可能被先执行到,你再多试几次就有可能出现demo run=0先出现。  就你的例子我试了下  第三次就出现了。我放个截图上来

demo.jpg (955.72 KB, 下载次数: 27)

demo.jpg

作者: 王斌    时间: 2012-12-7 11:23
Thread 线程,其实在平常我们所写的代码都是单线程的,也就是只有主线程在执行的,继承thread 类或其子类,就会实现多线程也就是至少会有两个线程在程序中同时执行,
如果把start改为run执行demo中的方法,之后才会执行主线程,是对的,但是现在是多线程都会抢占cpu资源,在某一时刻是随机的主线程抢占 到了资源,就打印了这就话了。
作者: Chaiber    时间: 2012-12-7 11:33
谢谢两位的回答,可能是我正好赶上了,我再去试试。




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