黑马程序员技术交流社区

标题: 多线程——用run和start有什么具体的区别呢? [打印本页]

作者: joure    时间: 2013-11-17 16:00
标题: 多线程——用run和start有什么具体的区别呢?
本帖最后由 joure 于 2013-11-18 10:55 编辑

创建新执行线程有两种方法。一种方法是将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法。接下来可以分配并启动该子类的实例。例如,计算大于某一规定值的质数的线程可以写成:
--------------------------------------------------------------------------------
     class PrimeThread extends Thread {http://edu.csdn.net/subject/net/index.shtml?vm1
         long minPrime;
         PrimeThread(long minPrime) {
             this.minPrime = minPrime;
         }
         public void run() {
             // compute primes larger than minPrime
              . . .
         }     }
--------------------------------------------------------------------------------
然后,下列代码会创建并启动一个线程:
     PrimeThread p = new PrimeThread(143);
     p.start();


上面是API中的帮助说明,调用run和start有什么具体的区别呢?  我的理解是 通过start开辟一个线程,通过run来执行和终结线程。
我想知道start和run的运行过程是怎样的呢?
他们各自可以单独调用吗?run可以开辟线程吗?
作者: zy888802    时间: 2013-11-17 16:07
run只是运行run方法里面的代码
start则,启动了线程并运行了代码
作者: zdrain    时间: 2013-11-17 16:08
你可以这样理解:

new一个线程对象代表开启了一个线程,效用线程start方法开启线程使之进入临时状态

run方法只是线程内容的一个容器(可以这么理解),调用start方法时虚拟机直接访问run方法的内容并开启线程

run方法不是开辟线程,他只是一个普通方法,呵呵
作者: 张佳鹏    时间: 2013-11-17 16:34
实类话 一个线程对象后 Thread t=new Thread();
调用t.start();后才会开启线程  执行run()方法里面的内容
作者: 张佳鹏    时间: 2013-11-17 16:36
t.start()有两个作用1开启线程 2执行run方法里面的内容
作者: 张佳鹏    时间: 2013-11-17 16:38
如果直接调用run()方法也是可以的 但是作用效果是主线程在执行run()方法的内容 不会有多线程
作者: hubby    时间: 2013-11-17 17:17
创建线程步骤
1:定义类继承Thread,
2,复写Thread类中的run方法
3,调用线程的start方法,启动线程,调用了run方法。
run和start都是Thread中的方法。
作者: wangyuyus    时间: 2013-11-17 17:43
调用run方法只会调用继承Thread的类的run方法,线程不会启动
调用start方法启动线程并运行继承Thread的类的run方法
作者: 陈文杰    时间: 2013-11-17 18:28
1) start:
用 start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的 start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法,这里方法 run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。
2) run:
run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。
总结:调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。
例如:
               DownloadThread downloadThread = new DownloadThread(mp3Info);
//启动新线程
Thread thread = new Thread(downloadThread);
thread.start();




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