黑马程序员技术交流社区

标题: 线程问题 [打印本页]

作者: 李蛟龙    时间: 2012-4-28 12:32
标题: 线程问题
大家都知道启动线程,用start()方法,而不是Thread类中run()。为什么,
如果就直接new Thread().run(),会怎样?分析下
作者: 张卯    时间: 2012-4-28 12:42
start和run的区别:
start:开启线程并执行该线程的run方法。
run:仅仅是对象调用方法,而线程创建后并没有运行。
作者: 韩新凯    时间: 2012-4-28 12:49
启动线程,用start()方法,而不是Thread类中run()。
如果创建了Thread的对象,说明创建了线程,如果不用.start()方法,那么线程就没有启动。
直接调用run()方法,而不是通过start()方法的话,实质上还是只有主线程在工作。
你可以比较两种方法的执行结果。如果调用run()方法,很明显是按顺序来的,调用start()的话,run方法和main函数里面的方法是交替执行。
作者: 胡奎    时间: 2012-4-28 12:56
run 仅仅是对象的方法而已,与普通方法没什么区别,通过对象来调用,但在线程中将要执行的线程代码的方法run方法中
start方法有两个作用一是启动线程,2是调用run方法。
如果只是new Thread().run()实际上就是普通方法的调用,而没有给他分配线程,程序必须等到run方法执行完毕才能执行run()方法以下部分代码。而不会像真正的线程那样会不停切换。
作者: 孙天    时间: 2012-4-28 13:03
因为start方法是开启线程用的,而run方法只是在该方法中定义线程要运行的代码,直接调用run方法线程是不会开启的
作者: 光sail    时间: 2012-4-28 14:45
run()只是线程的一个方法,用过线程对象来调用,将要执行的代码写在run方法中。但没有启动线程,线程的start()方法将为线程分配必须的系统资源,安排其运行,并调用线程体 ——run()方法。
作者: Friends★    时间: 2012-4-28 15:48
start:开启线程并调用了run()方法。

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

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

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

不过写成 new  Thread(这里通常加上一个对象).start();也是调用线程的一种方式。
作者: 魏征    时间: 2012-4-28 18:56
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方法。仍然为单线程。





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