1.線程的生命周期
要想實現多線程,必須在主線程中創建新的線程對象。Java語言使用Thread類及其子類的對象來表示線程,在它的
一個完整的生命周期中通常要經歷如下的五種狀態:
新建:當一個Thread類或其子類的對象被聲明並創建時,新生的線程對象處於新建狀態
就緒:處於新建狀態的線程被start()后,將進入線程隊列等待CPU時間片,此時它已具備了運行的條件
運行:當就緒的線程被調度並獲得處理器資源時,便進入運行狀態,run()方法定義了線程的操作和功能
阻塞:在某種特殊情況下,被人為掛起或執行輸入輸出操作時,讓出CPU並臨時中止自己的執行,進入阻塞狀態
死亡:線程完成了它的全部工作或線程被提前強制性地中止
2.創建線程的兩種方式
(1)繼承Thread類
1) 定義子類繼承Thread類。
2) 子類中重寫Thread類中的run方法。
3) 創建Thread子類對象,即創建了線程對象。
4) 調用線程對象start方法:啟動線程,調用run方法。
(2)實現Runnable接口
1)定義子類,實現Runnable接口。
2)子類中重寫Runnable接口中的run方法。
3)通過Thread類含參構造器創建線程對象。
4)將Runnable接口的子類對象作為實際參數傳遞給Thread類的構造方法中。
5)調用Thread類的start方法:開啟線程,調用Runnable子類接口的run方法。
兩種實現方式的區別:
①繼承Thread: 線程代碼存放Thread子類run方法中。
②實現Runnable:線程代碼存在接口的子類的run方法。
3.多線程程序的優點
1.提高應用程序的響應。對圖形化界面更有意義,可增強用戶體驗。
2.提高計算機系統CPU的利用率
3.改善程序結構。將既長又復雜的進程分為多個線程,獨立運行,利於理解和修改
4.線程中run()和start()的區別
1.run(); 只是調用了一個普通方法,並沒有啟動另一個線程,程序還是會按照順序執行相應的代碼。
2.start(); 則表示,重新開啟一個線程,不必等待其他線程運行完,只要得到cup就可以運行該線程。
比如:
<pre name="code" class="java">public class demo1 { public static void main(String args[]) { Thread t = new Thread() { public void run() { pong(); } }; t.start(); // t.run(); System.out.print("ping"); } static void pong() { System.out.print("pong"); } }
結果:
pingpong
public class demo2 { public static void main(String args[]) { Thread t = new Thread() { public void run() { pong(); } }; // t.start(); t.run(); System.out.print("ping"); } static void pong() { System.out.print("pong"); } }
結果是:
pongping