
上QQ阅读APP看书,第一时间看更新
1.4 线程启动方式
Java线程的核心启动方式只有一种,别的启动方式都是基于核心启动方式的一种包装。
线程启动方式有且只有一种,也就是通过Thread对象的start()方法启动,代码如下:

FourMain类主方法,代码如下:

执行结果如下:

注意:这里一定要理解线程启动后的概念。
主方法是Java虚拟机(JVM)的入口,主方法运行后会有3个线程启动。一个是默认的主线程,还有两个是通过线程对象.start()方法启动的线程,如图1-2所示。

图1-2 线程启动
Thread类start()方法的源代码删减版,只保留了核心的内容,如图1-3所示。线程对象start()方法执行后,最终会调用底层的start0()方法,start0()方法是由native修饰的,是Java虚拟机底层的方法,start0()方法执行后,最终会启动线程并回调此线程对象的run()方法。
线程对象的两种创建方式造就了run()方法执行后得到两种可能性。一种是继承自Thread类的,相当于直接重写了run()方法,另外一种就是实现了Runnable接口的,最终通过回调target.run()方法,回调到Runnable接口实现类的run()方法。
不管使用线程创建方式中的哪一种,最终都会回调指定对象的run()方法,所以在前面实现类时都要重写run()方法,如图1-4所示。

图1-3 Thread类start()核心源代码

图1-4 官方Thread类run()方法
修改FourMain类,代码如下:

执行结果如下:

注意:观察执行结果,并思考线程启动的方式。