Java學習筆記:多線程
Java中線程的五種狀態:
- 新建狀態(New)
- 就緒狀態(Runnable)
- 運行狀態(Running)
- 阻塞狀態(Blocked)
- 死亡狀態(Dead)
其中阻塞狀態(Blocked)又分為三種:
- 等待阻塞:運行狀態中的線程執行wait( )方法,使本線程進入到等待阻塞狀態
- 同步阻塞:線程在獲取synchronized同步鎖失敗(因為鎖被其他線程占用),會進入同步阻塞
- 其他阻塞:通過調用線程的sleep( )或join( )或發出了I/O請求時,線程會進入到阻塞狀態。當sleep( )狀態超時、join( )等待進程終止或超時、或者I/O處理完畢時,線程重新轉入就緒狀態
線程的創建有三種基本形式:
- 繼承Thread類,重寫該類的run( )方法
- 實現Runnable接口,並重寫該接口的run( )方法,創建Runnable實例類的實例,並以此實例作為Thread類的target來創建Thread,該Thread對象才是真正的線程對象
- 使用Callable和Future接口創建線程
繼承java.lang.Thread類 實例:
class Thread1 extends Thread{ private String name; public Thread1(String name) { this.name=name; }public void run() { for (int i = 0; i < 5; i++) { System.out.println(name + "運行 : " + i); try { sleep((int) Math.random() * 10); } catch (InterruptedException e) { e.printStackTrace(); } } } }
public class Main { public static void main(String[] args) { Thread1 mTh1=new Thread1("A"); Thread1 mTh2=new Thread1("B"); mTh1.start(); mTh2.start(); } }
程序啟動運行main時候,java虛擬機啟動了一個進程,主線程main在main( )調用時候被創建。隨著調用Thread對象的start方法,線程才正式啟動。
調用star方法並不是立即執行多線程代碼,而是使得該線程變為可運行態(Runnable),什麽時候運行是由操作系統決定的。
多線程程序都是亂序執行,因此,只有亂序執行的代碼才有必要設計為多線程。
Thread.sleep()方法調用目的是不讓當前線程獨自霸占該進程所獲取的CPU資源,以留出一定時間給其他線程執行的機會。實際上所有的多線程代碼執行順序都是不確定的,每次執行的結果都是隨機的。
實現java.lang.Runnable接口 實例:
class Thread2 implements Runnable { private String name; public Thread2(String name) { this.name = name; } @Override public void run() { for (int i = 0; i < 5; i++) { System.out.println(name + " 運行:" + i); try { Thread.sleep((int) Math.random() * 100); } catch (InterruptedException e) { e.printStackTrace(); } } } } public class Main { public static void main(String[] args) { new Thread(new Thread2("C")).start(); new Thread(new Thread2("D")).start(); } }
run( )方法是多線程程序的一個約定。所有的多線程代碼都在run方法裏面。Thread類實際上也是實現了Runnable接口的類。
在啟動的多線程的時候,需要先通過Thread類的構造方法Thread(Runnable target) 構造出對象,然後調用Thread對象的start()方法來運行多線程代碼。
實際上所有的多線程代碼都是通過運行Thread的start()方法來運行的。因此,不管是擴展Thread類還是實現Runnable接口來實現多線程,最終還是通過Thread的對象的API來控制線程的,熟悉Thread類的API是進行多線程編程的基礎。
End
非原創,文章參考
https://www.cnblogs.com/lwbqqyumidi/p/3804883.html
https://www.cnblogs.com/yjd_hycf_space/p/7526608.html
https://www.cnblogs.com/dolphin0520/p/3932921.html
侵刪
Java學習筆記:多線程