多執行緒的實作方法:
繼承Thread類別
實作Runnable類別
--------------------------------------- -------------------------------------------------- ----
1. 繼承Thread類別
繼承Thread類別之後,需要覆寫父類別的public void run() 方法,作為執行緒的主方法。
所有執行緒的執行一定是並發的,即:同一個時間段上會有多個執行緒交替執行。為了達到這樣的目的,絕對不能直接呼叫run()方法,而是應該呼叫Thread類別的start()方法啟動多執行緒。
呼叫 start() 方法與呼叫 run() 方法的比較:
public class MyThread extends Thread { private String name; public MyThread(String name) { this.name = name; } @Override public void run() { for(int i=0; i<10; i++) { System.out.println(name + "打印:" + i); } } public static void main(String[] args) { MyThread mt1 = new MyThread("线程A"); MyThread mt2 = new MyThread("线程B"); MyThread mt3 = new MyThread("线程C"); mt1.start(); mt2.start(); mt3.start(); } }
運作結果:(三個執行緒同時且交替執行依序執行)
2. start()方法實作多執行緒的原理
開啟Thread類別來源程式碼中()方法是所在作業系統的方法。
由於執行緒的啟動需要牽扯到作業系統中資源的分配問題,所以具體的執行緒的啟動應該根據不同的作業系統有不同的實作。而JVM則根據不同的作業系統中定義的start0()方法進行不同的實作。這樣,在多執行緒的層次上start0()方法的名稱不會改變,而不同的作業系統有不同的實作。原理圖
結論:只有Thread類別的start()方法才能進行作業系統資源的分配,所以啟動多執行緒的方式永遠就是Thread類別的start()方法。