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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 范鹏飞 中级黑马   /  2013-4-2 19:08  /  3347 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 范鹏飞 于 2013-4-3 11:16 编辑

想问下run方法和start方法有什么区别?我这儿有点晕,start也是调用的run方法,同样是执行的。为什么直接调用run方法就相当于是一直在运行主线程,而用start方法调用的时候,就是主线程和start线程切换运行?        

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

6 个回复

倒序浏览
直接调用run()方法,不理解为调用主线程,只能说是调用一个普通的方法而已.Main()函数本身就是一个主线程.
而创建其它的线程必须继承Thread或或者实现Runnable接口,并由这两者自已的start()调用run()方法,所以子类必须自已创建run()复写父类子的run())方法.

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
ㄨ____陌生 来自手机 中级黑马 2013-4-2 19:38:43
藤椅
开启线程的方法就是start,start()用来启动线程,真正实现了多线程,这时无需等待run()方法体代码执行完毕而直接继续执行下面的代码:通过调用Thread类的start()方法此线程处于就需状态并没有运行,然后通过此Thread类调用方法run()来完成其运行操作的,这里方法run()称为线程体,她包含了要执行这个线程的内容,run方法运行结束,此线程终止。而cpu再运行其他线程。

run()当做普通的方法调用,程序还是要顺序执行,还是要等待run方法体执行完毕后才执行下面的代码,而如果直接用run方法,这只是调用一个方法而已,程序中依然只有主程序这一个线程,其程序执行路径还是一条,这样就没有达到写线程的目的。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报 1 0
如果直接调用run()方法,那不叫线程,只能说是普通的方法调用。只有通过start()方法才能够说是启动一个线程,线程和方法调用是完全不同的两个概念

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
启动线程使用start()方法而不是run()方法。调用start()方法来启动线程,系统会把该run()方法当成线程执行体来处理;但如果直接调用线程对象的run()方法,则run()方法会立即执行,而且在run()方法返回之前其他线程无法并发执行,直接调用对象的run()方法系统会把线程对象当成一个普通对象,而run()方法也是一个普通方法,而不是线程执行体

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
run方法是里面存放的是要这个线程要运行的代码,
start方法是启动线程并执行run方法里面的内容。
通过代码演示:
  1. class ZiT extends Thread{
  2.         public void run(){//存放的要运行的代码
  3.                 for(int x = 0;x<30;x++){
  4.                         System.out.println("run....."+x);
  5.                 }
  6.         }
  7. }

  8. public class Demo1{
  9.         public static void main(String[] args) {
  10.        
  11.                 ZiT zit = new ZiT();//创建一个线程。这个线程并没有启动
  12.                 //(由于main函数是程序的入口,创建线程是由主线程执行的,当执行到zit.run()的时候,只是普通的调用一个类的run方法,)
  13.                 //zit.run();
  14.                 zit.start();//是启动这个线程,并由这个线程执行run方法里面的内容。
  15.                
  16.                 for(int x = 0;x<50;x++){
  17.                         System.out.println(Thread.currentThread().getName()+"..."+x);
  18.                 }
  19.         }
  20. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
若还有问题,继续追问; 没有的话,将帖子分类改成【已解决】哦~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马