java Thread中的start()和run()

有什么不同之处,需要注意些什么?

 

一、实际效果

(1)上代码

test.java

如果使用:

可以正常使用多线程处理run方法。

但是如果使用:

就会发现所有的run方法都是在main线程中进行处理的,根本没有使用多线程。

(2)结论

参考:http://blog.csdn.net/xuxurui007/article/details/7685076

(1)使用start()方法启动线程,才是真正实现了多线程运行

无需等待run方法体代码执行完毕,不会被阻塞,可以直接继续执行下面的代码。

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

(“然后CPU再调度其它线程”的说法可能有误。run运行时线程可以主动把CPU资源出让)

(2)run()方法当作普通方法的方式调用,程序还是要同步执行

等待run方法体执行完毕后,才可继续执行下面的代码。

程序中只有主线程这唯一的线程,没有达到多线程的效果。

二、看看源码

(1)Runnable接口

因为Thread类实现了Runnable接口,所以肯定要实现这个run方法,就是Thread.run()。

(2)Thread类

1.看看run方法

再看看这个target是什么:

发现target就是Runnable接口。

个人理解:如果我们重构了run方法,那么将执行我们重写的run方法。如果没有重写run方法,那就什么都不执行。

2.看看start方法

除了抛出很多错误以外,核心代码是这个start0():

似乎很多资料都在说,start()实际上也是调用了run()。所以我就想看一下是不是实现在start0里面了。

但是在源码中我没有找到这个start0的实现。

(start0是private native void start0()方法,也就是jvm自己实现的原生方法(不仅限于使用c实现),想要看实现只能去看jvm的源码,在java代码中是找不到的)

后来查了一下,在下面的网站中有详细说明:

https://www.ibm.com/developerworks/cn/java/j-lo-processthread/

涉及到jvm和操作系统对多线程的底层实现。因为我暂时还不能理解,不继续深究。

(这有啥好看不懂的,懒就懒吧)

三、总结

总之,如果要并发,那么当然使用start()。如果要在当前线程上跑run方法,才直接调用run()(这种情况似乎比较少见)。

发表评论

电子邮件地址不会被公开。 必填项已用*标注