執行緒的幾種建立方法
阿新 • • 發佈:2020-12-21
建立執行緒的四種方式:
-
繼承Thread類,並複寫run方法,建立該類物件,呼叫start方法開啟執行緒。此方式沒有返回值。
// 建立執行緒物件 Thread t = new Thread() { public void run() { // 要執行的任務 } }; // 啟動執行緒 t.start()
-
實現Runnable介面,複寫run方法,建立Thread類物件,將Runnable子類物件傳遞給Thread類物件。呼叫start方法開啟執行緒。此方法2較之方法1好,將執行緒物件和執行緒任務物件分離開。降低了耦合性,利於維護。此方式沒有返回值。
Runnable runnable = new Runnable() { public void run(){ // 要執行的任務 } }; // 建立執行緒物件 Thread t = new Thread( runnable ); // 啟動執行緒 t.start();
-
建立FutureTask物件,建立Callable子類物件,複寫call(相當於run)方法,將其傳遞給FutureTask物件(相當於一個Runnable)。 建立Thread類物件,將FutureTask物件傳遞給Thread物件。呼叫start方法開啟執行緒。這種方式可以獲得執行緒執行完之後的返回值。該方法使用Runnable功能更加強大的一個子類.這個子類是具有返回值型別的任務方法。
// 建立任務物件 FutureTask<Integer> task3 = new FutureTask<>(() -> { log.debug("hello"); return 100; }); // 引數1 是任務物件; 引數2 是執行緒名字,推薦 new Thread(task3, "t3").start(); // 主執行緒阻塞,同步等待 task 執行完畢的結果 Integer result = task3.get(); log.debug("結果是:{}", result);
-
執行緒池
- 提供了一個執行緒佇列,佇列中儲存著所有等待狀態的執行緒。避免了建立與銷燬額外開銷,提高了響應的速度。
常見的幾種狀態
【初始狀態】僅是在語言層面建立了執行緒物件,還未與作業系統執行緒關聯
【可執行狀態】(就緒狀態)指該執行緒已經被建立(與作業系統執行緒關聯),可以由 CPU 排程執行
【執行狀態】指獲取了 CPU 時間片執行中的狀態
當 CPU 時間片用完,會從【執行狀態】轉換至【可執行狀態】,會導致執行緒的上下文切換
【阻塞狀態】
如果呼叫了阻塞 API,如 BIO 讀寫檔案,這時該執行緒實際不會用到 CPU,會導致執行緒上下文切換,進入【阻塞狀態】
等 BIO 操作完畢,會由作業系統喚醒阻塞的執行緒,轉換至【可執行狀態】
與【可執行狀態】的區別是,對【阻塞狀態】的執行緒來說只要它們一直不喚醒,排程器就一直不會考慮排程它們
【終止狀態】表示執行緒已經執行完畢,生命週期已經結束,不會再轉換為其它狀態