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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

启动线程为什不直接调用run()方法,而是调用start()方法来间接的调用run()方法?

10 个回复

倒序浏览
只有调用Thread的start方法,将线程交由JVM控制,才能产生多线程,而直接调用run方法只是一个普通的单线程程式。

http://blog.csdn.net/sunshinestation/article/details/4260781
回复 使用道具 举报
run()方法只是类中的一个方法,直接调用run()方法,那还是一个主线程,执行完第一个run()在执行下一个调用的run(),是个单线程;
start()是创建了一个线程,使新线程运行Thread类的run()方法里面的代码,而主线程继续,实现了多线程,
回复 使用道具 举报
假设Demo类继承了Thread,在主函数中有以下代码
Demo d = new Demo();//创建一个线程。
d.start();//开启线程并执行该线程的run方法,那么这是多线程
d.run();//仅仅是对象调用方法,即线程创建了,但没有运行,那么这是单线程,仅仅有主线程
你自己写一下简单代码,在dos窗口输出打印一下就清楚了
回复 使用道具 举报
每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()成为线程体
必须通过调用Thread类的start()方法来启动一个线程
回复 使用道具 举报
你如果调用run方法,那么调用者就会将执行权转交给run方法。要等run方法执行完调用者才能继续执行。这就等于普通的调用了,
用调用start方法,该方法会另外开启一个独立的线程运行run方法,而调用者可以继续执行下面的代码。毕老师的视频多看几遍就
很快明白了
回复 使用道具 举报
郑涛 中级黑马 2012-3-15 22:53:30
7#
不管是继承Thread类还是实现Runable接口,覆写run()方法是将要准备运行的代码放进去,创建了线程。而线程开始执行需要使用start()方法来开启线程。Java这样的设计也正是降低程序设计解耦性的体现。
因为假如写一个run()方法就可以开启线程,要实现多线程的并发,需要写很多run(),而现在大多数时候只要写一个run(),然后用不同的线程对象通过调用start()方法来开启,就能轻松实现多线程。
回复 使用道具 举报
如果你直接调用run()方法!只是主线程, 是单继承, start()方法为Thread类中的方法, 要调用Thread类中的start()方法开启线程,并自动调用run()方法,这样才实现了多线程;
回复 使用道具 举报
唐林渊 黑马帝 2012-3-15 23:43:49
9#
因为start()有两个功能 第一就是开始线程,第二就是调用run()方法.如果你只调用了run()方法 而没有开启线程,那你创建的线程就浪费了.
回复 使用道具 举报
袁野 黑马帝 2012-3-16 07:18:41
10#
statt()方法是开启线程调用run()方法
回复 使用道具 举报
那你说我们为什么要覆盖run()方法呢?还不是因为Thread类用于描述线程。它里面就这么强制性的规定了我这里头有一个run方法啊,你们想要玩多线程就得覆盖这个方法,把需要执行的内容放到我这里边来啊,这个run方法我不会让main线程来执行的,我会给你们提供一个方法来让这个run函数里头的东西跑起来的,就是start方法,你知道要创建好了线程对象,再用这个对象调用我提供给你的start方法,我就让你多加一个线程进来,否则,你也别想用run方法中的东西。

所以Thread类就定义了一个功能用于存储线程要运行的代码,该存储功能就是run()方法。也就是说Thread类中的run方法是用于存储线程要运行的代码。start方法是专门区别于主线程来使用的,如果这个run方法内容让main线程执行了,那还叫什么多线程?它自己一个人干完了,兄弟们吃什么喝什么。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马