黑马程序员技术交流社区

标题: 线程调用问题 [打印本页]

作者: _王涛    时间: 2013-3-31 11:16
标题: 线程调用问题
本帖最后由 _王涛 于 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方法,二者有什么区别呢?开启线程是个什么概念?
作者: lucy198921    时间: 2013-3-31 11:20
1 start:

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

2 run:

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

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

作者: 张超    时间: 2013-3-31 12:26
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秒");
   
}
}



作者: 杨玉辉    时间: 2013-3-31 15:42
你可以这么看,d.run(),是主线程按照先后顺序执行,执行完再往下执行其它线程,这是在保证该主程序可以执行完的前提下。

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

开启线程:通常所说的线程,多数就是指多线程,就是一个程序一执行,这个程序内部各个可能会用到的功能,就基本处于待命状态,你点击启动后,就会开辟一个或多个线程吧,按照预先设计好的执行顺序,实现功能,方便高效。 继承Thread 类 一般只用于启动一个程序的线程。
作者: 王俊杰    时间: 2013-3-31 17:28
记得有人问过这个问题。我把我当时的回复粘贴过来吧~~

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

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

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

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

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


共同学习,共同进步!!
作者: 杜加璇    时间: 2013-3-31 19:34
class Demo extends Thread{
public void run(){
   for(int i=0;i<10;i++){
     System.out.println("run demo"+i);
   }                                                                     这里相当于你创建了一个多线程如果你不调用start方法开启的话的话,这个线程是不会执行的。执行d.start(),线程开启run方法也会被执行。




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