【簡述】
java使用Thread類代表線程,所有的線程都必須是Thread或者其子類的實例。
每個線程的任務就是完成一定的任務,實際上就是執行一段程序流。
【創建並啟動多線程的步驟(集成Thread類方式)】
1.定義繼承Thread類的子類,重寫run方法:run()方法就代表了線程需要完成的任務,故run()方法稱為:線程執行體。
2.創建線程對象:即創建Thread子類的實例。
3.啟動線程:調用線程對象的start()方法來。
【示例代碼FirstThread.java】
package com.Higgin.part01; //1.1定義繼承Thread類的子類FirstThread class FirstThread extends Thread{ //1.2重寫run方法 public void run(){ for(int i=0;i<10;i++){ //注意:當線程繼承Thread類時,直接使用this.getName()即可獲得當前線程的名字 System.out.println(this.getName()+"===="+i); } } } public class Demo1{ public static void main(String[] args) { //2.創建線程對象 FirstThread t1=new FirstThread(); //3.啟動線程 t1.start(); //2.創建線程對象 FirstThread t2=new FirstThread(); //3.啟動線程 t2.start(); for(int i=0;i<10;i++){ //調用Thread.currentThrad().getName()可獲得當前線程的名字 System.out.println(Thread.currentThread().getName()+"===="+i); } } }
【注意!!!】
啟動線程使用 start()方法,不是run()方法!!永遠不要調用線程對象的run()方法!!!
調用start()方法,系統會把run()方法當成線程執行體來處理。
直接調用run()方法,則run()方法會立即被執行,系統會把線程對象當成一個普通對象來處理,run()方法也變成了一個普通的方法。
另外,直接調用線程對象的run()方法,則run()方法內不能通過getName()來獲得當前執行線程的名字,而是需要使用Thread.currentThread先獲得當前線程,再調用線程的getName()方法來獲得線程的名字。
另外,調用了線程的run()方法之后,該線程已經不再處於新建狀態,不要再次調用線程對象的start()方法,只能對處於新建狀態的線程調用start()方法,否則會引發IllegalThreadStateException異常。
【運行結果】
【注意一:主線程勿忘】
java程序開始運行時,程序至少會創建一個主線程,不要忘記了,本例中的main()方法的方法體就是主線程的線程執行體。
【注意二:兩個讀取線程名字的方法的區別】
1. Thread.currentThread():currentThread()是Thread類的靜態方法,該方法是獲取當前正在執行的線程的線程對象。
2.getName():該方法是Thread類的實例方法,該方法返回調用該方法的線程的名字。
【注意三:關於線程名字】
1.默認情況下,主線程的名字是main,用戶啟動的線程名字依次是:Thread-0、Thread-1......
2.當然,可以通過setName(String name)來設置對應的線程的名字。