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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马肖凯骏 中级黑马   /  2012-3-17 13:08  /  3342 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑马肖凯骏 于 2012-3-17 14:29 编辑

在启用多线程时,为什么必须通过start()方法来调用run()方法呢?


感谢大家的热心解答,我刚仔细查看了一下start()的方法体

start
public void start()使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
结果是两个线程并发地运行;当前线程(从调用返回给 start 方法)和另一个线程(执行其 run 方法)。

多次启动一个线程是非法的。特别是当线程已经结束执行后,不能再重新启动。


抛出:
IllegalThreadStateException - 如果线程已经启动。

在一个类中的start()方法调用时可能会抛出IllegalThreadStateException
重复调用会抛出该异常,此处真正调用的是start()方法中的start0(),此方法在声明处使用native关键字,则需要调用本机的操作系统函数,

因为多线程的实现是要依靠底层的操作系统支持的。


所以就不难理解为什么要使用start()了,实际上还是跟CPU调用有关系!

5 个回复

倒序浏览
java中thread的start()和run()的区别:

1.start()方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码:

通过调用Thread类的start()方法来启动一个线程,
这时此线程是处于就绪状态,
并没有运行。
然后通过此Thread类调用方法run()来完成其运行操作的,
这里方法run()称为线程体,
它包含了要执行的这个线程的内容,
Run方法运行结束,
此线程终止,
而CPU再运行其它线程,



2.run()方法当作普通方法的方式调用,程序还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码:

而如果直接用Run方法,
这只是调用一个方法而已,
程序中依然只有主线程--这一个线程,
其程序执行路径还是只有一条,
这样就没有达到写线程的目的。

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
第一
我们首先要创建个线程
start()开启线程,并执行该线程的run方法。
run()仅仅是对象调用方法。而线程创建了,并没有运行。
举个例子
Demo d1 = new Demo();创建好第一个线程。
Demo d2 = new Demo();创建好第二个线程。
d1.start();开启线程并执行该线程的run方法。
d2.start();
这样d1和d2 切换着随机运行,真正实现了多线程运行。
Demo d1 = new Demo();创建好第一个线程。
Demo d2 = new Demo();创建好第二个线程。
d1.run();对象调用方法。而线程创建了,并没有开启。
d2.run();对象调用方法。而线程创建了,并没有开启。
这样程序按顺序运行,结果是 d1先运行,d2等待,d1运行结束之后,d2才开运行。

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
刘宁 发表于 2012-3-17 13:26
第一
我们首先要创建个线程
start()开启线程,并执行该线程的run方法。

谢谢,不过您这个回答我还没有看明白!
回复 使用道具 举报
因为直接调用线程对象的run方法,run方法会立刻执行,而且在run方法返回之前其他线程无法并发执行,
但是调用start方法来启动线程,系统会把该run方法当成线程执行体来处理,此时线程处于就绪状态,表示线程可以运行,但是该线程是否运行取决于JVM的调度,但这时倘若有多个线程都处于就绪状态,就可以并发执行,
通常情况下使用多线程,是几个线程并发执行的,所以使用start方法比较好。
回复 使用道具 举报
同意藤椅 楼层的
用start()保证了真正的多线程。
如果直接调用run()方法。
线程就是个摆设而已。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马