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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 高双武 黑马帝   /  2011-11-10 10:11  /  2040 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

当我们创建一个新的线程后假如为Thread2,然后是Thread2.start();然后start()在调用run()方法,为什么不直接Thread2.run()?这样就运行了run()方法啊

6 个回复

正序浏览
start()启用线程,并调用run(),如果直接Thread2.run()仅仅是对象调用,而创建的线程并没有运行。

class Demo extends Thread
{
    public void run()
{
    for(int i=0;i<10;i++)
    {
       System.out.println("创建的新线程");
    }
}
}

class ThreadDemo
{
   public static void main(String args[])
{
       Demo d=new Demo();
       d.run();

for(int i=0;i<10;i++)
    {
       System.out.println("主线程");
    }
}
}
如果如上面,程序会执行完Demo中的run(),输出10行“创建的新线程”再执行主函数里的输出语句,输出10行“主线程”
回复 使用道具 举报


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



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

总结:调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。
回复 使用道具 举报
刚才我看了一下Thread这个类的源码,我也没看太懂,大概是这个意思
下边是start方法的源代码:
public synchronized void start() {
        if (started)
            throw new IllegalThreadStateException();
        started = true;
        group.add(this);
        start0();
    }
首先是一个started它是Thread类的一个成员变量来判断线程的状态,一般为true否则会抛出异常。
下边group.add(this);
group是ThreadGroup类的对象,代表的是线程组,我个人认为它可能是要把你创建的新线程注册到线程组当中,在这个线程组中要初始化好多参数,所以我想可能是为了安全和Thread的实现机制有关吧
回复 使用道具 举报
start()的作用是: 启动线程 运行run方法
stat()用于自动调用run(),这是JAVA的内在机制规定的
希望能帮到你
回复 使用道具 举报
run()方法:在本线程内调用该Runnable对象的run()方法,可以重复多次调用;

start()方法:启动一个线程,调用该Runnable对象的run()方法,不能多次启动一个线程,
简单的说就是start()方法才是启动一个新线程,run()方法你调用多少次都是在主程序里执行的,就像调其它方法不会启动线程一样
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马