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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© star5603 高级黑马   /  2014-7-23 17:07  /  2440 人查看  /  16 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 star5603 于 2014-7-25 10:14 编辑

老毕留的问题。。。
大神解释下。。。

16 个回复

倒序浏览
我还没回顾到那,但是印象中:

run()方法是线程中必须要覆盖的方法,任务主要在该方法中被线程执行
start()方法是开启线程,开辟另一个线程的。

@override
public vioid run(){
     //任务
}  

new Thread().start();  开启线程
回复 使用道具 举报

start:

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

run:

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


总结.

调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。这两个方法应该都比较熟悉,把需要并行处理的代码放在run()方法中,start()方法启动线程将自动调用 run()方法,这是由jvm的内存机制规定的。并且run()方法必须是public访问权限,返回值类型为void.。


回复 使用道具 举报
调用run()方法,使用的仍然是主线程,start()方法才是开启一条新线程。:)
回复 使用道具 举报
rolling-stone 发表于 2014-7-23 18:22
start:用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行 ...

那么多线程资源共享问题又该怎么解释你呢?实现Runnable接口才能进行共享资源,在你创建多个线程对象时候分别调用start()资源却不会共享,
回复 使用道具 举报
闪电博尔特 发表于 2014-7-24 12:14
那么多线程资源共享问题又该怎么解释你呢?实现Runnable接口才能进行共享资源,在你创建多个线程对象时候 ...

用Runnable接口创建线程需要分四部:
1.用自定义的类实现Runnable接口
2.复写run()这方法,在run方法里面可以书写你想共享的资源.
3.将实现Runnable接口的那个类的对象当做参数,传到用Thread类来创建的对象中,例如class Test implements Runnable()
{
     public void run()
     {
              ..........................//定义共享资源
     }
}
class TestDemo
{
      Test t = new Test();
       Thread t1 = new Thread(t);//将t作为参数传到Thrad中.
       t1.start();//启动线程
}
4.启动start,创建线程.(简单一句就是:start的作用就是1.创建线程。2.调用run方法.)
回复 使用道具 举报
run()方法是线程中必须要覆盖的方法,任务主要在该方法中被线程执行 start()方法是开启线程,开辟另一个线程的
回复 使用道具 举报
.run(),就是去调用这个方法,.start才是开启线程....... 用run的话,线程基本就没什么意义了...
回复 使用道具 举报
rolling-stone 发表于 2014-7-24 13:47
用Runnable接口创建线程需要分四部:
1.用自定义的类实现Runnable接口
2.复写run()这方法,在run方法里面 ...

比如卖火车票线程类中声明ticket=5;你再声明两个线程对象;run()方法实现的是只要有票就减一;那样的话你的两个线程对象分别以start()启动;怎么就达不到共享目的了呢?而两个分别调用run()却可以;票数依次减少分别为5,4,3,2,1为止
回复 使用道具 举报
调用线程中的start方法,,该方法有两个作用;启动线程,调用run方法;而run方法只是将自定义的代码存储在run方法中,让线程运行
回复 使用道具 举报
闪电博尔特 发表于 2014-7-25 09:50
比如卖火车票线程类中声明ticket=5;你再声明两个线程对象;run()方法实现的是只要有票就减一;那样的话 ...

先进行共享内容的同步,或者你可以调用Thread.sieep(10),这样类似的东西,先让第一个线程进来后睡10毫秒,具体同步的方法,还有你火车票的例子。毕向东的视频里面都有提到,你可以认真看一下食品,就知道了如何通过Start来是两个线程共享run方法里面的共享内容.
回复 使用道具 举报
看看,学学,,:lol
回复 使用道具 举报
我是来围观学习的~~~~~
回复 使用道具 举报
调用start才能开启线程,其中覆盖run方法,run方法中的内容Java虚拟机会开辟一块内存去执行它。在主函数中直接调用run方法,只是普通的方法调用而已,不会产生线程。
回复 使用道具 举报
这个。。。。。。。。。
回复 使用道具 举报
M单色调 来自手机 中级黑马 2014-7-25 23:14:07
16#
还没看到!
回复 使用道具 举报
M单色调 来自手机 中级黑马 2014-7-25 23:15:18
17#
还没看到!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马