網(wǎng)站建設(shè)優(yōu)化是什么鬼蘇州seo優(yōu)化
在使用java多線程時,有三種方式創(chuàng)建線程 復習傳送門
當使用繼承Thread來實現(xiàn)多線程時,
我們會把線程執(zhí)行的代碼寫在run() 方法中,
使用Thread的start()方法來啟動一個線程。
代碼如下:
public class ThreadDemo extends Thread{@Overridepublic void run() {System.out.println("this is demo thread :"+Thread.currentThread().getName());}public static void main(String[] args) {ThreadDemo t = new ThreadDemo();t.start();System.out.println("this is main thread :"+Thread.currentThread().getName());}
}
執(zhí)行結(jié)果:
this is main thread :main
this is demo thread :Thread-0Process finished with exit code 0
在main
方法中,為什么不直接 調(diào)用 t.run()
來啟動線程?
因為t.run()
是調(diào)用實例方法(會直接在當前線程中執(zhí)行run中的邏輯),
而start才是啟動線程,在新線程中執(zhí)行run方法里的邏輯。
我們來看看Thread
類的 start
方法究竟做了什么?
public synchronized void start() {if (threadStatus != 0)throw new IllegalThreadStateException();group.add(this);boolean started = false;try {start0();started = true;} finally {try {if (!started) {group.threadStartFailed(this);}} catch (Throwable ignore) {/* do nothing. If start0 threw a Throwable thenit will be passed up the call stack */}}}private native void start0();
可以看到,start()
方法中調(diào)用了 start0()
,而 start0()
是一個native
方法。
native
關(guān)鍵字表示該方法是一個本地方法,java中提供了機制可以調(diào)用C的方法,它可以通過動態(tài)庫加載,可以通過navtive來調(diào)用。
Java中的線程,其實是由操作系統(tǒng)來提供的。
在Java高級語言與操作系統(tǒng)之間,是通過JVM來調(diào)用的。
start0()
是JVM層面實現(xiàn)的方法。
start0()
方法會調(diào)用操作系統(tǒng)底層的指令去創(chuàng)建一個線程,并且啟動線程。
操作系統(tǒng)通過調(diào)度算法,把生成的線程調(diào)度,分配給不同的CPU。
操作系統(tǒng)會調(diào)用JVM的run,最終調(diào)回Java Thread的run方法。
最終使得run中的邏輯在線程中運行。
當線程執(zhí)行結(jié)束后,JVM會完成銷毀。