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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李蛟龙 中级黑马   /  2012-4-28 12:32  /  2929 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

大家都知道启动线程,用start()方法,而不是Thread类中run()。为什么,
如果就直接new Thread().run(),会怎样?分析下

评分

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

查看全部评分

7 个回复

倒序浏览
start和run的区别:
start:开启线程并执行该线程的run方法。
run:仅仅是对象调用方法,而线程创建后并没有运行。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
启动线程,用start()方法,而不是Thread类中run()。
如果创建了Thread的对象,说明创建了线程,如果不用.start()方法,那么线程就没有启动。
直接调用run()方法,而不是通过start()方法的话,实质上还是只有主线程在工作。
你可以比较两种方法的执行结果。如果调用run()方法,很明显是按顺序来的,调用start()的话,run方法和main函数里面的方法是交替执行。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
run 仅仅是对象的方法而已,与普通方法没什么区别,通过对象来调用,但在线程中将要执行的线程代码的方法run方法中
start方法有两个作用一是启动线程,2是调用run方法。
如果只是new Thread().run()实际上就是普通方法的调用,而没有给他分配线程,程序必须等到run方法执行完毕才能执行run()方法以下部分代码。而不会像真正的线程那样会不停切换。

评分

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

查看全部评分

回复 使用道具 举报
因为start方法是开启线程用的,而run方法只是在该方法中定义线程要运行的代码,直接调用run方法线程是不会开启的

评分

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

查看全部评分

回复 使用道具 举报
run()只是线程的一个方法,用过线程对象来调用,将要执行的代码写在run方法中。但没有启动线程,线程的start()方法将为线程分配必须的系统资源,安排其运行,并调用线程体 ——run()方法。
回复 使用道具 举报
start:开启线程并调用了run()方法。

run():只是一个方法而已,如果你只用对象调用它,线程根本就没有启动。

你说直接new Thread().run()会怎样?

new  Thread()表明你已经创建了一个线程,你后面加上一个run()方法,还只是单纯的调用run()方法而已,跟你直接用一个对象调用没有什么区别,而线程还是没有被开启。

不过写成 new  Thread(这里通常加上一个对象).start();也是调用线程的一种方式。

评分

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

查看全部评分

回复 使用道具 举报
魏征 中级黑马 2012-4-28 18:56:40
8#
Thread类中的start()方法是用于多线程的操作,当设定多个Thread对象时,调运start()会交替的运行每个线程。而Thread类中的run方法是定义线程操作的内容,如果调用run()方法,任然只有主线程,在主线程中按照顺序运行每个run()方法。
class Thread1 extends Thread
{
      run()
          {
             //设定代码语句
             }
}
class Thread2 extends Thread
{
      run()
          {
             //设定代码语句
             }
}
class Demo1
{
        public static void main(String[] args)
            {
                Thread1 t1=new Thread1();
                 Thread2 t2=new Thread2();
                  t1.start();
                  t2.start();
                  }
}               //t1线程和t2线程交替运行。为多线程。
class Demo2
{
        public static void main(String[] args)
            {
                Thread1 t1=new Thread1();
                 Thread2 t2=new Thread2();
                  t1.run();
                  t2.run();
                  }
}               //只是调用了t1线程和t2线程中的run方法编辑的内容,先运行t1的run方法,运行完毕后再运行t2的run方法。仍然为单线程。

评分

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

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马