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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王光保 黑马帝   /  2011-7-18 11:22  /  3066 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么在启动线程的时候不能直接使用run()方法?在启动多线程时为什么必须通过start()方法启动,而不能直接调用run()方法呢?

评分

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

查看全部评分

3 个回复

倒序浏览
黑马网友  发表于 2011-7-18 13:29:29
沙发
线程所使用的run方法,来自于Runnable接口,而 线程启动需要调用Thread类的start()方法。
  •  Start()方法负责建立线程。如果线程建立成功,则自动转调用run()方法。
  •  在Start()方法中除了会转调用run()方法外,[color=Red]还会进行一些其它操作[/color] 。
      |-  比如调用windows的建立线程函数CreateThread。
  •  因此,若人为的调用run() 方法则并不是启动线程,而是咱们常见的“方法调用”。

评分

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

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-19 12:38:18
藤椅
线程一定要经过  新建(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]

评分

参与人数 1技术分 +2 收起 理由
admin + 2 加分必须的!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-19 17:21:51
板凳
声明实现 Runnable 接口的类。通常情况下也是这个方法。同时也要实现 Runnable 类的run() 方法。然后可以分配该类的实例,在创建 Thread 时作为一个参数来传递并启动。顺序 先 start() 后run(),忘了张老师啥说了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马