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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 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可以开辟线程吗?

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 淡定

查看全部评分

8 个回复

倒序浏览
run只是运行run方法里面的代码
start则,启动了线程并运行了代码
回复 使用道具 举报
你可以这样理解:

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

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

run方法不是开辟线程,他只是一个普通方法,呵呵

评分

参与人数 1技术分 +1 收起 理由
FFF + 1

查看全部评分

回复 使用道具 举报
张佳鹏 来自手机 初级黑马 2013-11-17 16:34:08
板凳
实类话 一个线程对象后 Thread t=new Thread();
调用t.start();后才会开启线程  执行run()方法里面的内容
回复 使用道具 举报
张佳鹏 来自手机 初级黑马 2013-11-17 16:36:43
报纸
t.start()有两个作用1开启线程 2执行run方法里面的内容
回复 使用道具 举报
张佳鹏 来自手机 初级黑马 2013-11-17 16:38:39
地板
如果直接调用run()方法也是可以的 但是作用效果是主线程在执行run()方法的内容 不会有多线程
回复 使用道具 举报
hubby 中级黑马 2013-11-17 17:17:36
7#
创建线程步骤
1:定义类继承Thread,
2,复写Thread类中的run方法
3,调用线程的start方法,启动线程,调用了run方法。
run和start都是Thread中的方法。
回复 使用道具 举报
调用run方法只会调用继承Thread的类的run方法,线程不会启动
调用start方法启动线程并运行继承Thread的类的run方法
回复 使用道具 举报
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();

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 赞一个!

查看全部评分

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