1. 程式人生 > >Java學習筆記:多線程

Java學習筆記:多線程

ide 實例 and @override 正式 future 基礎 [] bsp

Java中線程的五種狀態:

  1. 新建狀態(New)
  2. 就緒狀態(Runnable)
  3. 運行狀態(Running)
  4. 阻塞狀態(Blocked)
  5. 死亡狀態(Dead)

其中阻塞狀態(Blocked)又分為三種:

  1. 等待阻塞:運行狀態中的線程執行wait( )方法,使本線程進入到等待阻塞狀態
  2. 同步阻塞:線程在獲取synchronized同步鎖失敗(因為鎖被其他線程占用),會進入同步阻塞
  3. 其他阻塞:通過調用線程的sleep( )或join( )或發出了I/O請求時,線程會進入到阻塞狀態。當sleep( )狀態超時、join( )等待進程終止或超時、或者I/O處理完畢時,線程重新轉入就緒狀態

線程的創建有三種基本形式:

  1. 繼承Thread類,重寫該類的run( )方法
  2. 實現Runnable接口,並重寫該接口的run( )方法,創建Runnable實例類的實例,並以此實例作為Thread類的target來創建Thread,該Thread對象才是真正的線程對象
  3. 使用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學習筆記:多線程