黑马程序员技术交流社区

标题: run和start什么区别? [打印本页]

作者: star5603    时间: 2014-7-23 17:07
标题: run和start什么区别?
本帖最后由 star5603 于 2014-7-25 10:14 编辑

老毕留的问题。。。
大神解释下。。。
作者: baiiiu    时间: 2014-7-23 17:15
我还没回顾到那,但是印象中:

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

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

new Thread().start();  开启线程
作者: rolling-stone    时间: 2014-7-23 18:22

start:

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

run:

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


总结.

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



作者: 黑马_java猿    时间: 2014-7-23 22:08
调用run()方法,使用的仍然是主线程,start()方法才是开启一条新线程。:)
作者: 闪电博尔特    时间: 2014-7-24 12:14
rolling-stone 发表于 2014-7-23 18:22
start:用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行 ...

那么多线程资源共享问题又该怎么解释你呢?实现Runnable接口才能进行共享资源,在你创建多个线程对象时候分别调用start()资源却不会共享,
作者: rolling-stone    时间: 2014-7-24 13:47
闪电博尔特 发表于 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方法.)

作者: caiyaoren    时间: 2014-7-24 14:02
run()方法是线程中必须要覆盖的方法,任务主要在该方法中被线程执行 start()方法是开启线程,开辟另一个线程的
作者: Caincxy    时间: 2014-7-24 14:10
.run(),就是去调用这个方法,.start才是开启线程....... 用run的话,线程基本就没什么意义了...
作者: 闪电博尔特    时间: 2014-7-25 09:50
rolling-stone 发表于 2014-7-24 13:47
用Runnable接口创建线程需要分四部:
1.用自定义的类实现Runnable接口
2.复写run()这方法,在run方法里面 ...

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

先进行共享内容的同步,或者你可以调用Thread.sieep(10),这样类似的东西,先让第一个线程进来后睡10毫秒,具体同步的方法,还有你火车票的例子。毕向东的视频里面都有提到,你可以认真看一下食品,就知道了如何通过Start来是两个线程共享run方法里面的共享内容.
作者: HPU--spring87    时间: 2014-7-25 21:28
看看,学学,,:lol
作者: 我行我SHOW‰    时间: 2014-7-25 21:36
我是来围观学习的~~~~~
作者: zxtanshui    时间: 2014-7-25 22:26
调用start才能开启线程,其中覆盖run方法,run方法中的内容Java虚拟机会开辟一块内存去执行它。在主函数中直接调用run方法,只是普通的方法调用而已,不会产生线程。
作者: 止询初衷    时间: 2014-7-25 22:50
这个。。。。。。。。。
作者: M单色调    时间: 2014-7-25 23:14
还没看到!
作者: M单色调    时间: 2014-7-25 23:15
还没看到!




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