黑马程序员技术交流社区

标题: 线程创建的疑问~~~ [打印本页]

作者: 胡大强    时间: 2012-6-17 14:10
标题: 线程创建的疑问~~~
class ThreadDemo
{
        public static void main(String[] args)
        {
                 new Test().start();   //这里调用的是start()方法
                 //new Test().run();

                while(true){
                        System.out.println("主线程运行!");
        }
}
}
class Test extends Thread{   //继承Thread类
        public void run(){
                while(true){
                        System.out.println(Thread.currentThread().getName()+"正在运行!");
}
}
}



继承Thread类后,启动线程start()后,还会自动调用run()么?不然怎么回事交替运行显示的呢?
作者: 龙秋地    时间: 2012-6-17 14:21
Thread类中的start方法:
void start()
     功能:使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
void run()
       功能: 如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。
楼主要是调用start()方法的话,那虚拟机会自动调用run(),并且会跟主程序中的语句交替进行.
如果直接调用run()方法的话,会按主方法中的语句顺序执行.
其实我不太了解楼主想要问什么.
作者: 刘春发    时间: 2012-6-17 14:21
线程调用start()方法会使线程开始执行;Java 虚拟机调用该线程的 run 方法。
作者: 刘春发    时间: 2012-6-17 14:22
线程调用start()方法会使线程开始执行;Java 虚拟机调用该线程的 run 方法。
作者: 胡大强    时间: 2012-6-17 16:49
龙秋地 发表于 2012-6-17 14:21
Thread类中的start方法:
void start()
     功能:使该线程开始执行;Java 虚拟机调用该线程的 run 方法。  ...

就是说继承之后,如果继承之后调用run,子类中定义了,调用了;那Thread类中的run呢?是被子类覆盖了?或者是优先级?
作者: 吴琼    时间: 2012-6-17 16:58
继承Thread必须重写父类的Run方法,线程一开启就是在调用自己定义的run方法.
如果你想要运行父类的run方法只能通过父类创建对象了.
作者: 龙秋地    时间: 2012-6-17 17:27
胡大强 发表于 2012-6-17 16:49
就是说继承之后,如果继承之后调用run,子类中定义了,调用了;那Thread类中的run呢?是被子类覆盖了?或 ...

子类既然复写了run()方法,那么子类调用run()的时候就是被复写后的方法.
下面我来科普一下毕老师的讲课内容:
为什么要覆盖run()方法呢:
Thread类用于描述线程.
该类就定义了一个功能,用于存储线程要运行的代码,那么存储功能的实现就是run()方法.

接下来如果你调用start()方法,那么你就启动了一个线程,而且这个线程所执行的代码就存在run()里,
就是你想要让子类运行的功能.
如果直接调用run()方法,那么就没有开启线程,那么虚拟机执行主函数中run()方法,只是单纯的对象调用.
跟多线程就没有关系了.就是单线程了.

真心的希望楼主能看懂.不懂的话,可以看看毕老师11天-03的视频.


作者: 龙秋地    时间: 2012-6-17 17:28
本帖最后由 龙秋地 于 2012-6-17 17:29 编辑

发重复了 删珊珊-------------------删
作者: 胡大强    时间: 2012-6-17 17:42
龙秋地 发表于 2012-6-17 17:27
子类既然复写了run()方法,那么子类调用run()的时候就是被复写后的方法.
下面我来科普一下毕老师的讲课内 ...

嗯。。。恍然大悟啊。。
一个是单线程,一个多线程情况。
多线程情况下,创建线程并start,会自动调用run,若子类中覆盖run方法,线程启动后还会自动调用子类中定义的run。。。
毕老师的视频还没看到线程这里额。。。结果就先遇到了问题。。。多谢这位兄台的解释,很不错~!
作者: 龙秋地    时间: 2012-6-17 17:44
胡大强 发表于 2012-6-17 17:42
嗯。。。恍然大悟啊。。
一个是单线程,一个多线程情况。
多线程情况下,创建线程并start,会自动调用run ...

客气客气 你也很厉害啊 还没看到这 就能想这么多~~~~
善于思考真是个好习惯.




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