建立執行緒的四種方式:
繼承thread類,並複寫run方法,建立該類物件,呼叫start方法開啟執行緒。此方式沒有返回值。
// 建立執行緒物件
thread t = new thread()
};// 啟動執行緒
t.start()
實現runnable介面,複寫run方法,建立thread類物件,將runnable子類物件傳遞給thread類物件。呼叫start方法開啟執行緒。此方法2較之方法1好,將執行緒物件和執行緒任務物件分離開。降低了耦合性,利於維護。此方式沒有返回值。
runnable runnable = new runnable()
};// 建立執行緒物件
thread t = new thread( runnable );
// 啟動執行緒
t.start();
建立futuretask物件,建立callable子類物件,複寫call(相當於run)方法,將其傳遞給futuretask物件(相當於乙個runnable)。 建立thread類物件,將futuretask物件傳遞給thread物件。呼叫start方法開啟執行緒。這種方式可以獲得執行緒執行完之後的返回值。該方法使用runnable功能更加強大的乙個子類.這個子類是具有返回值型別的任務方法。
// 建立任務物件
futuretasktask3 = new futuretask<>(() -> );
// 引數1 是任務物件; 引數2 是執行緒名字,推薦
new thread(task3, "t3").start();
// 主線程阻塞,同步等待 task 執行完畢的結果
integer result = task3.get();
log.debug("結果是:{}", result);
執行緒池常見的幾種狀態
【初始狀態】僅是在語言層面建立了執行緒物件,還未與作業系統執行緒關聯
【可執行狀態】(就緒狀態)指該執行緒已經被建立(與作業系統執行緒關聯),可以由 cpu 排程執行
【執行狀態】指獲取了 cpu 時間片執行中的狀態
當 cpu 時間片用完,會從【執行狀態】轉換至【可執行狀態】,會導致執行緒的上下文切換
【阻塞狀態】
如果呼叫了阻塞 api,如 bio 讀寫檔案,這時該執行緒實際不會用到 cpu,會導致執行緒上下文切換,進入【阻塞狀態】
等 bio 操作完畢,會由作業系統喚醒阻塞的執行緒,轉換至【可執行狀態】
與【可執行狀態】的區別是,對【阻塞狀態】的執行緒來說只要它們一直不喚醒,排程器就一直不會考慮排程它們
【終止狀態】表示執行緒已經執行完畢,生命週期已經結束,不會再轉換為其它狀態
執行緒sleep方法的面試題
執行緒sleep方法的面試題 thread類原始碼展示sleep方法 問題 下面 中的t.sleep 3000 會讓自定義的t執行緒睡眠3秒鐘嗎?如果不會,那麼是讓主線程睡眠3秒嗎?為什莫呢?class mythread extends thread public class sleeptest c...
面試題 執行緒
今天公司新來的小夥伴問了我這樣乙個面試題 他不清楚為什麼最後輸出的是thread中的方法,而不是runnable中的方法,然後我看了下他從網上搜出的別人寫的答案,很多東西對於懂的人來說很容易就能看懂,但是對於剛剛踏入這一行業的人來說,他不明白。所以希望很多在這塊迷茫的小夥伴能夠更好的掌握這一點,那麼...
多執行緒面試題
題目 主線程執行10次,子執行緒執行10次,此過程重複50次 package com.thread.test function 主線程執行10次,子執行緒執行10次,此過程重複50次 public class threadproblem start for int j 0 j 50 j class ...