線程是程序內部的一條執行路徑java
一個進程,同一時間並行多個線程,多線程安全
線程做爲調度和執行的單位,每一個線程擁有獨立的運行棧和程序計數器網絡
存在安全問題多線程
一個java應用程序,至少有三個線程:main()主線程,併發
方式一ide
繼承於Thread類線程
步驟:code
//例:遍歷100之內的全部偶數 //1.建立一個繼承於Thread類的子類 public class MyThread extends Thread{ //2.重寫Thread類的run() @Override public void run() { for (int i = 0; i <=1000 ; i++) { if(i%2==0){ System.out.println(Thread.currentThread().getName()+":"+i); } } } } class ThreadTest { public static void main(String[] args) { //3.建立Thread類的子類的對象 MyThread myThread= new MyThread(); //4.經過此對象調用start()①啓動當前線程②調用當前線程的run() myThread.start(); // 以下操做任然是在main()線程執行的 for (int i = 0; i <=1000 ; i++) { if(i%2!=0){ // Thread.currentThread().getName()獲取線程名 System.out.println(Thread.currentThread().getName()+":"+i); } } } }
方式二對象
實現Runnable接口blog
步驟:
建立一個實現了Runnable接口的類
實現類中實現Runnable中的抽象方法:run()
建立實現類的對象
將此對象做爲參數傳遞到Thread類的構造器中,建立Thread類的對象
經過Thread類的對象調用start()
//1. 建立一個實現了Runnable接口的類 class MIThread implements Runnable{ // 2. 實現類中實現Runnable中的抽象方法:run() @Override public void run() { for (int i = 0; i < 100; i++) { if(i%2==0){ System.out.println(Thread.currentThread().getName()+":"+i); } } } } class ThreadTes{ public static void main(String[] args) { // 3. 建立實現類的對象 MIThread mi= new MIThread() ; // 4. 將此對象做爲參數傳遞到Thread類的構造器中,建立Thread類的對象 Thread t1=new Thread(mi); // 5. 經過Thread類的對象調用start(),啓動當前線程,調用當前線程的run方法,底層是Thread含有Runnable類型參數的構造器 t1.start(); // 再啓動一個線程 Thread t2=new Thread(mi); t2.start(); } }
比較兩種建立方式
開發中優先選擇,實現Runnable接口的方式
緣由:
聯繫: public class Thread implements Runnable
相同點:兩種方式都須要重寫run() 將線程 要執行的邏輯聲明在run()中;
優先級
NORM_PRIORITY : 5
獲取和設置當前線程的優先級
高優先級的線程要搶佔低優先級線程的CPU執行權,只是從機率上講,高優先級有很高几率會執行,但並不意味着高優先級的線程執行完,低優先級的才執行;
新建:Thread類或子類對象被聲明建立時
就緒:新建的線程被start()後,獲取了其餘全部的資源,只是沒分配到CPU資源
運行:獲取CPU資源,執行
阻塞:某種特殊狀況下,讓出CPU並臨時終止本身的執行
死亡:完成它的所有工做或線程提早被強制性的終止,異常致使結束;
狀態圖