黑马程序员技术交流社区

标题: 关于线程的start()和run() 问题 [打印本页]

作者: 黄小钒    时间: 2012-3-25 17:48
标题: 关于线程的start()和run() 问题
代码如下:

代码运行结果如下:

我的问题是:既然d.run 仅仅是对象调用方法,线程创建了,并没有运行,但当我在run() 方法里获取当前线程的名称,线程的名称却是Thread-0 , 此处有一点不解, 请高手解答,谢谢!
作者: 贠(yun)靖    时间: 2012-3-25 17:56
就是因为你创建了一个线程啊   你Demo继承了Thread类   所以Demo中的成员属性和成员方法 也就继承了  Thread类中的非私有的成员属性和方法
   而Thread类中 默认给每一个线程都起名字了 你调用getName方法就是继承父类的get方法   显然就有名字了  
  所以说只要你创建了一个线程 不管启动不启动 这个线程已经存在在内存中了  像你这种测试  可以理解为 仅仅没有让线程运行而已  而这个线程该有的功能和属性都已经具备了
作者: 唐林渊    时间: 2012-3-25 18:01
创建了线程  你没有开启不就是个废的吗?  所以他只会沿着主函数开辟的线程来进行
作者: 黄小钒    时间: 2012-3-25 18:06
贠(yun)靖 发表于 2012-3-25 17:56
就是因为你创建了一个线程啊   你Demo继承了Thread类   所以Demo中的成员属性和成员方法 也就继承了  Threa ...

那是不是说 这里只有一个主线程在运行,而Thread-0 这个线程并没有运行?
作者: 刘元霄    时间: 2012-3-25 18:18
你已经创建了线程了,但是没有启动只是运行了。
作者: 贠(yun)靖    时间: 2012-3-25 18:18
黄小钒 发表于 2012-3-25 18:06
那是不是说 这里只有一个主线程在运行,而Thread-0 这个线程并没有运行?

是啊  你创建的那个线程没有运行  他里面的的成员属性随着你创建线程对象已经存在了
作者: 李成    时间: 2012-3-25 18:26
本帖最后由 李成 于 2012-3-25 18:30 编辑

start()方法本身就是调用线程里的run()方法他俩的区别文字也不好说给你画了图

start()是在主线程外开始运行一个新的线程,run()的就在主线里执行线程的run方法说白了就是主线程直接执行了这个线程。
作者: 黄奇耀    时间: 2012-3-25 18:47
Demo d = new Demo(); //创建Thread对象,分配了内存,并在内存中存放着其对象
d.run();//没有调用start()方法,没有启动新线程。run()方法只是在方法体内保存要多线程的代码。
获取到Thread-0线程名,是刚刚创建线程的名称。主线程名称一般名为main。
回答下3楼的追问:Thread-0 这个线程没有启动,因为没有调用start()方法。
作者: 黄小钒    时间: 2012-3-25 19:01
黄奇耀 发表于 2012-3-25 18:47
Demo d = new Demo(); //创建Thread对象,分配了内存,并在内存中存放着其对象
d.run();//没有调用start() ...

有点明白了, 谢谢楼上各位的指点,也感谢那位画图的同学,图画的很美观 :D




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