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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 徐炯 中级黑马   /  2012-6-6 21:10  /  2137 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 徐炯 于 2012-6-7 15:50 编辑

同题,Thread类的start()与run()的区别是什么?
我们知道,在java程序里,一般至少运行两个线程,即:main()相关线程和jvm的垃圾回收机制相关的线程。当我们用start()开启另一个线程后,程序是如何并发执行的。请附代码详细解释下

2楼的回答很详细,其它的回答也不错。

评分

参与人数 1黑马币 +2 收起 理由
 夜风 + 2 赞一个!

查看全部评分

5 个回复

倒序浏览
1.start()方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码

通过调用Thread类的start()方法来启动一个线程,
这时此线程是处于就绪状态,
并没有运行。
然后通过此Thread类调用方法run()来完成其运行操作的,
这里方法run()称为线程体,
它包含了要执行的这个线程的内容,
Run方法运行结束,
此线程终止,
而CPU再运行其它线程

2.run()方法当作普通方法的方式调用,程序还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码

而如果直接用Run方法,
这只是调用一个方法而已,
程序中依然只有主线程--这一个线程,
其程序执行路径还是只有一条,
这样就没有达到写线程的目的。

举例说明一下:

记住:线程就是为了更好地利用CPU,
提高程序运行速率的!

public class TestThread1{
  public static void main(String[] args){
    Runner1 r=new Runner1();
    //r.run();//这是方法调用,而不是开启一个线程
    Thread t=new Thread(r);//调用了Thread(Runnable target)方法。且父类对象变量指向子类对象。
    t.start();

    for(int i=0;i<100;i++){
      System.out.println("进入Main Thread运行状态");
      System.out.println(i);
    }
  }
}

class Runner1 implements Runnable{ //实现了这个接口,jdk就知道这个类是一个线程
  public void run(){
    for(int i=0;i<100;i++){
      System.out.println("进入Runner1运行状态");
      System.out.println(i);
    }
  }
}

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1

查看全部评分

回复 使用道具 举报
  区别:调用start方法实现多线程,而调用run方法没有实现多线程

    Start:

    用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到spu时间片,就开始执行run()方法,这里方法run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。

    Run:

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

    总结:调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。

回复 使用道具 举报
所谓的并发执行是这样的:实际上是cpu在极短的时间里做切换分别执行的每个线程,而从宏观上(一段时间)是同时运行。所以,这里的主线程和start线程轮流有就会被cpu执行,展现出来就是cpu同时运行两线程了。
回复 使用道具 举报
简单的说!start()开启了线程,会自动去调用run();
直接调用run()就相当调用本类方法的run()并没有开启线程
这就是Thread类的start()与run()的区别。。
针对你问的问题
回复 使用道具 举报
简单的说!start()开启了线程,会自动去调用run();
直接调用run()就相当调用本类方法的run()并没有开启线程
这就是Thread类的start()与run()的区别。。
针对你问的问题
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马