黑马程序员技术交流社区

标题: 多线程中的run()方法 [打印本页]

作者: 黑马肖凯骏    时间: 2012-3-17 08:31
标题: 多线程中的run()方法
多线程类有是先运行start方法,start方法实际上是调用run方法.我不明白的地方是run()方法能否被多次调用呢?

作者: 李创    时间: 2012-3-17 08:35
Thread(Runnabletarget)

该构造方法中的参数是一个Runnable类型的接口,因此,在创建线程对象时必须向构造方法的参数传递一个实现Runnable接口类的实例,该实例对象称作所创线程的目标对象,当线程调用start()方法后,一旦轮到它来享用CPU资源,目标对象就会自动调用接口中的run()方法(接口回调),这一过程是自动实现的,用户程序只需要让线程调用start()方法即可,也就是说,当线程被调度并转入运行状态时,所执行的就是run()方法中所规定的操作。

2)        关于run()方法中的局部变量

对于具有相同目标对象的线程,当其中一个线程享用CPU资源时,目标对象自动调用接口中的run()方法,这时,run()方法中的局部变量被分配内存空间,当轮到另一个线程享用CPU资源时,目标对象会再次调用接口中的run()方法,那么,run()方法中的局部变量会再次分配内存空间。也就是说run()方法已经启动运行了两次,分别运行在不同的线程中,即运行在不同的时间片内。不同线程的run()方法中的局部变量互不干扰,一个线程改变了自己的run()方法中局部变量的值不会影响其他线程的run()方法中的局部变量的值。

3)        在线程中启动其他线程

线程通过调用start()方法将启动该线程,使之从新建状态进入就绪队列排队,一旦轮到它来享用CPU资源时,就可以脱离创建它的主线程独立开始自己的生命周期了。

4.        线程的常用方法

1)        start()方法

线程调用该方法将启动线程,使之从新建状态进入就绪队列排队,一旦轮到它来享用CPU资源时,就可以脱离创建它的线程独立开始自己的生命周期了。

2)        run()方法

Thread类的run()方法与Runnable()接口中的run()方法的功能和作用相同,都用来定义线程对象被调度之后执行的操作,都是系统自动调用而用户程序不得引用的方法。系统的Thread类中,run()方法没有具体内容,所以用户程序需要创建自己的Thread类的子类,并重写run()方法来覆盖原来的run()方法。当run()方法执行完毕,线程就变成死亡状态,所谓死亡状态就是线程释放了实体,即释放分配给线程对象的内存。在线程没有结束run()方法之前,不赞成让线程再调用start()方法,否则将发生IllegalThreadStateException异常。

作者: 张润政    时间: 2012-3-17 09:19
额,通常我们创建一个线程,要么就继承Thread覆盖run()方法,要么定义类实现Runnable接口、覆盖Runnable接口中的run方法将线程要运行的代码存放在run方法中。目的是:将自定义的代码存储在run方法中,让线程运行。建立对象,调用start()方法。
调用start方法的作用:启动线程,并调用run()方法执行。
这个run方法是我们调用start之后自定义线程开始执行的入口。当线程开始执行了。它就只能进入一次run方法,将里面的语句都执行完毕。结束这个run方法,线程也就随之结束。一个线程在从建立到消亡,它只调用了一次自己的入口run方法。不能被多次调用。
举个例子,我们写好了程序之后,程序是不是有一个入口?这个入口叫main方法。你见过一个程序有执行了好多次main方法的吗?main方法结束,主线程就结束了。这是一个线程的消亡。run()方法的作用其实就充当了你自定义线程的入口。相当于主线程的main入口,没有这个入口线程就不能启动。


请笑纳呀{:soso_e128:}
作者: 黄奇耀    时间: 2012-3-17 11:43
多次调用run()方法,就是执行多次的start()方法。就像跑步一样,start()一次,跑出去了。跑到半路时再start()一次,这人又要重新在起点开始跑。
作者: OMG    时间: 2012-3-17 12:59
源代码:我们写代码的时候,我们没有调用run()方法,
字节码:在程序被启动之后,会内部调用run()方法,因为我们要执行的代码都在run()方法中;
执行过程:必须重复调用run()方法,因为在cpu瞬间切换的时候,线程会暂停,当再切换回来的时候,线程又运行,这是又调用run()方法;
参考如下:
JDK中的Thread类代码中的run()方法:
public void run() {
      if (target != null) {
           target.run();
      }
}
   
总结:必须重复调用run()方法,直到程序结束;




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