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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© _王涛 中级黑马   /  2013-3-31 11:16  /  1769 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 _王涛 于 2013-3-31 20:52 编辑

class Demo extends Thread{
public void run(){
  for(int i=0;i<10;i++){
    System.out.println("run demo"+i);
  }
}
}
public class ThreadDemo {
public static void main(String args[]){
  Demo d=new Demo();
    d.start();
}
}
我们在运行线程时,d.run();与d.start();这两步该怎么理解呢?老师说d.run();调用的是run方法,而d.start(),也是
为了调用线程中的run方法,二者有什么区别呢?开启线程是个什么概念?

评分

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

查看全部评分

5 个回复

倒序浏览
1 start:

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

2 run:

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

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

评分

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

查看全部评分

回复 使用道具 举报
1  先要理解什么是线程,线程的是一个程序的执行线索,开启线程就是给程序能创造一个执行线索。

2 d.run();与d.start();这两步该怎么理解呢?
   d.run()当程序执行到这里的时候不会创建新的执行线索,也就是还按照以前的执行线索运行也就是主线程,
而d.start()是指的是一个继承Thread或者实现Runnable的对象调用关于一个start()的方法,就是是开启一个线程,这个地方你可以去看一下start()d的源代码看是怎么实现的。

下面我给你试试他们的区别
注意一下运行的结果


class Demo extends Thread{
public void run(){
  for(int i=0;i<10;i++){
    System.out.println("run demo"+i);
  }
}

} class ThreadDemo {
public static void main(String args[]) throws InterruptedException{
  Demo d=new Demo();
    //d.start();
    d.run();
    Thread.currentThread().sleep(50);
    System.out.println("main thread 休息5秒");
   
}
}


评分

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

查看全部评分

回复 使用道具 举报
你可以这么看,d.run(),是主线程按照先后顺序执行,执行完再往下执行其它线程,这是在保证该主程序可以执行完的前提下。

d.start() 是与主线程里的其它线程交替执行,没有主次之分,具体执行哪一个,交给cpu分配

开启线程:通常所说的线程,多数就是指多线程,就是一个程序一执行,这个程序内部各个可能会用到的功能,就基本处于待命状态,你点击启动后,就会开辟一个或多个线程吧,按照预先设计好的执行顺序,实现功能,方便高效。 继承Thread 类 一般只用于启动一个程序的线程。

评分

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

查看全部评分

回复 使用道具 举报
记得有人问过这个问题。我把我当时的回复粘贴过来吧~~

我对这个问题理解得也不是很深刻。我查找了一下《Java语言程序设计》里面的内容。

线程有5种状态,新建,就绪,运行,阻塞和终止。

start()用来启动一个线程,让这个线程进入可调度状态,线程获得调度的时候会自动执行run()

run()是由调度程序调用的,run()返回的时候该线程就进入终止状态了

我们用start方法将线程置于可调度状态就可以了。这样线程就等着java的线程调度器来调度它了。


共同学习,共同进步!!

评分

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

查看全部评分

回复 使用道具 举报
class Demo extends Thread{
public void run(){
   for(int i=0;i<10;i++){
     System.out.println("run demo"+i);
   }                                                                     这里相当于你创建了一个多线程如果你不调用start方法开启的话的话,这个线程是不会执行的。执行d.start(),线程开启run方法也会被执行。

评分

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

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马