1. 程式人生 > >jdk原始碼學習之路之Thread和Runable

jdk原始碼學習之路之Thread和Runable

執行緒的幾個狀態 NEW 新建狀態  RUNABLE 就緒狀態  RUNNING 執行狀態 BLOCKED 阻塞狀態 DEAD 終止狀態

NEW 狀態通過start() 進入就緒狀態 獲得時間片進入RUNNING 狀態 

阻塞狀態產生 主動睡眠主動wait 等待IO資源等等

阻塞狀態解除 IO資源釋放 同步程式碼塊釋放 睡眠時間結束 notify 進行喚醒

實現Callable介面可以帶返回值 

 

通過原始碼我們發現Thread是Runable的子類即是具體實現

Runable 介面 

我們會發現Runable只提供一個抽象方法 表示一個執行緒普通呼叫

Thread 提供了很多構造方法 接受介面型別 執行緒分組

執行緒名稱 

執行緒名稱用volatile修飾表示對其他執行緒可見執行緒安全

yield()方法表示 使當前執行緒從執行狀態(執行狀態)變為可執行態(就緒狀態)讓出cpu

表示當前執行緒讓出CPU但是不放棄鎖

start()表示一個開啟一個執行緒並且使其進入就緒狀態(可執行)得到時間片就開始執行run方法

中斷執行緒 首先檢查許可權

呼叫執行緒的wait(), wait(long)或wait(long, int)會讓它進入等待(阻塞)狀態,或者呼叫執行緒的join(), join(long), join(long, int), sleep(long), sleep(long, int)也會讓它進入阻塞狀態。若執行緒在阻塞狀態時,呼叫了它的interrupt()方法,那麼它的“中斷狀態”會被清除並且會收到一個InterruptedException異常

join底層呼叫的wait方法它會釋放物件鎖,而sleep則不會釋放物件鎖,只有同步方法執行完畢,其他執行緒才能執行

thread的wait是繼承Object 通過notify進行喚醒

ThreadPoolExecutor建立執行緒池

建立一個執行緒池需要初始化的一些引數

corePoolSize 表示常駐核心執行緒數 如果等於0表示任務執行後沒有任何請求進入時銷燬執行緒池執行緒如果大於0不會被銷燬

maximumPoolSize 表示執行緒池同時執行的最大執行緒數必須大於等於1 和corePoolSize相等的話表示固定大小執行緒池

keepAliveTime 表示執行緒池空閒時間當達到keepAliveTime時執行緒則會被銷燬直至和corePoolSize相等執行緒數大於corePoolSize時

這個引數設定才會生效 allowCoreThreadTimeOut設定true達到時間時核心執行緒也會被收回

TimeUnit時間單位通常是TimeUnit.SECONDS

workQueue表示快取隊列當請求執行緒數大於maximumPoolSize執行緒會進入BlockingQueue阻塞佇列

threadFactory表示執行緒工廠可以用來生產一組相同任務的執行緒

handler表示執行拒絕策略物件當執行緒數超過任務快取佇列上限時可以通過此策略處理請求,這是一個限流保護策略

儲存到資料庫進行削峰填谷。空閒時間再提取出來執行

轉向某個提示頁面

列印日誌

Executors的核心方法

Executors.newWorkStealingPool建立足夠的執行緒支援足夠的並行度並通過多個佇列減少競爭CPU數量設定預設並行度

jdk1.8時候才加入此方法

Executors.newCachedThreadPool  maximumPoolSize 最大可以至Integer.MAX_VALUE 是可以高度伸縮的執行緒池

相信達到最大值什麼處理器也涼了吧 肯定會丟擲OOM 異常 keepAliveTime預設設定60秒

Executors.newScheduledThreadPool 執行緒數最大Integer.MAX_VALUE 與newChachedThreadPool相同它是ScheduledExecutorService的實現類支援定時週期性的執行任務他不回收執行緒

Executors.newSingleThreadExecutor建立一個單執行緒的執行緒池相當於單執行緒執行所有任務保證任務按照提交順序依次執行

Executors.newFixedThreadPool輸入的引數即是固定的執行緒數即是核心執行緒數也是最大執行緒數不存在空閒執行緒所以keepAliveTime等於0

ThreadPoolExecutor四種內部靜態類

AbortPolicy丟棄任務並且丟擲RejectedExecutionException異常

DiscardPolicy 丟棄任務不丟擲異常

DiscardOldestPolicy丟棄最早的任務最早的任務把當前任務加入佇列

CallRunsPolicy 呼叫任務run() 繞過執行緒池直接執行