黑马程序员技术交流社区

标题: 请大神解答 [打印本页]

作者: xmmsbb    时间: 2015-5-14 16:28
标题: 请大神解答
class Demo extends Thread
{
        public void run()
        {
                for(int x=0;x<20;x++)
                {
                        System.out.println(Thread.currentThread().getName()+"......"+x);
                }
        }
}
class ThreadDemo7
{
        public static void main(String[] args)
        {
                Demo d1=new Demo();
                Demo d2=new Demo();
                d1.start();
                d2.run();
        }
}
如果改成d1.run();d2.start();
结果为什么会不一样?
作者: 冷月霜飞    时间: 2015-5-14 17:46
线程对象调用run方法和调用start方法有区别的
调用run方法不开启线程,仅仅是对象调用方法而已,而调用start开启线程,同时会让JVM调用run方法在开启的线程中执行
希望能解决你的问题了!
作者: bboyXiaoNuo    时间: 2015-5-14 18:01
就你这样写来说虽然调用原理完全不同但是表面看运行结果应该没区别吧?
作者: 大西洋    时间: 2015-5-14 18:13
start启动多线程,而run 只启动一个线程。
作者: xmmsbb    时间: 2015-5-14 19:38
bboyXiaoNuo 发表于 2015-5-14 18:01
就你这样写来说虽然调用原理完全不同但是表面看运行结果应该没区别吧?

不,运行结果有很大区别,虽然只是换个顺序
作者: xmmsbb    时间: 2015-5-14 19:39
冷月霜飞 发表于 2015-5-14 17:46
线程对象调用run方法和调用start方法有区别的
调用run方法不开启线程,仅仅是对象调用方法而已,而调用star ...

就是说在调用run()方法的时候还没有开启其他线程,等run()方法结束以后才开启的这个线程是吧
作者: xmmsbb    时间: 2015-5-14 19:41
大西洋 发表于 2015-5-14 18:13
start启动多线程,而run 只启动一个线程。

哦哦 ,我懂了,谢谢
作者: xmmsbb    时间: 2015-5-14 19:44
zyhcss 发表于 2015-5-14 19:41
哦哦 ,我懂了,谢谢

你好 我叫赵俨杭,来自山东,目前正在筹备考黑马,能留个QQ互相加一下吗?
作者: guojiadui    时间: 2015-5-14 20:42
其实每一次运行都会不同,因为是多线程,运行的先后不能保证,会有不同结果
作者: yuanhnu    时间: 2015-5-14 22:18
没改之前,有两个线程在运行,一个是d1,一个是主线程,修改之后,还是两个线程运行,一个是主线程,一个是d2线程。run有两个作用,一个是启动线程,另外一个是调用run方法
作者: anywayDo    时间: 2015-5-14 23:57
虽然看完了所有的解释,我还是有点不懂。。
作者: 冯毓权    时间: 2015-5-15 05:15
就一句话解释:因为d1.start()是开启多线程,d2.run()只是调用run方法,所以
d1.start();
d2.run();
这样写的时候,有主线程和d1创建的线程,由于线程间切换的不确定性,输出结果可能是main和Thread-0交叉,main先输出完,再Thread-0,Thread-0先输出完,再main。
当d1.run();d2.start();
这样写的时候,首先d1对象调用Demo的run方法,会将run方法中循环输出完毕后才会结束。之后执行到d2.start();开启多线程,由于主线程中没有任何输出语句,所以之后的输出都是d2开启的线程在调用run方法中的输出语句


作者: xmmsbb    时间: 2015-5-15 10:17
yuanhnu 发表于 2015-5-14 22:18
没改之前,有两个线程在运行,一个是d1,一个是主线程,修改之后,还是两个线程运行,一个是主线程,一个是d ...

start()是启动线程吧 run()方法是定义线程任务的




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