黑马程序员技术交流社区

标题: Java多线程的启动方法 [打印本页]

作者: 王光保    时间: 2011-7-18 11:22
标题: Java多线程的启动方法
为什么在启动线程的时候不能直接使用run()方法?在启动多线程时为什么必须通过start()方法启动,而不能直接调用run()方法呢?
作者: 匿名    时间: 2011-7-18 13:29
线程所使用的run方法,来自于Runnable接口,而 线程启动需要调用Thread类的start()方法。
  •  Start()方法负责建立线程。如果线程建立成功,则自动转调用run()方法。
  •  在Start()方法中除了会转调用run()方法外,[color=Red]还会进行一些其它操作[/color] 。
      |-  比如调用windows的建立线程函数CreateThread。
  •  因此,若人为的调用run() 方法则并不是启动线程,而是咱们常见的“方法调用”。
作者: 匿名    时间: 2011-7-19 12:38
线程一定要经过  新建(new)、就绪(Runnable)、执行(Running)、阻塞(Bolcked)、死亡
1、在执行start()方法后,表示线程可以运行,至于什么时候运行取决于JVM李的线程调度器的调度

2、调用start方法来启动线程,系系统会把改run方法当成线程执行体来处理,如果直接调用线程对象的run方法
则run方法会立即被执行,而且run方法返回之前其他线程无法并发执行--也就是说系统把线程对象当成一个普通
对象看到,而run方法也是一个普通方法,就不是线程的执行体[code=java]public class InvokeRun extends Thread
{
        private int i ;
        //重写run方法,run方法的方法体就是线程执行体
        public void run()
        {
                for ( ; i < 100 ; i++ )
                {
                        //直接调用run方法时,Thread的this.getName返回的是该对象名字,
                        //而不是当前线程的名字。
                        //使用Thread.currentThread().getName()总是获取当前线程名字
                        System.out.println(Thread.currentThread().getName() +  " " + i);
                }
        }
       
    public static void main(String[] args)
    {
        for (int i = 0; i < 100;  i++)
        {
                        //调用Thread的currentThread方法获取当前线程
                        System.out.println(Thread.currentThread().getName() +  " " + i);
                        if (i == 20)
                        {
                                //直接调用线程对象的run方法,
                                //系统会把线程对象当成普通对象,run方法当成普通方法,
                                //所以下面两行代码并不会启动2条线程,而是依次执行2个run方法
                                new InvokeRun().run();
                                new InvokeRun().run();
                        }
        }
    }
}[/code]
作者: 匿名    时间: 2011-7-19 17:21
声明实现 Runnable 接口的类。通常情况下也是这个方法。同时也要实现 Runnable 类的run() 方法。然后可以分配该类的实例,在创建 Thread 时作为一个参数来传递并启动。顺序 先 start() 后run(),忘了张老师啥说了




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