1 建立執行緒
extends thread
implements runnable
啟動執行緒:threadl類的start()
執行緒完成:1、run()方法執行完成;2、丟擲乙個未處理的異常導致執行緒的提前結束
2 執行緒的狀態
新建立 執行緒被建立,但是沒有呼叫start方法
可執行(runnable) 執行狀態,由cpu決定是不是正在執行
被阻塞(blocking) 阻塞,執行緒被阻塞於鎖
等待/計時等待(waiting) 等待某些條件成熟
被終止 執行緒執行完畢
3 執行緒的常用方法
run()和start()
run就是乙個普通的方法,跟其他類的例項方法沒有任何區別。
sleep()
不會釋放鎖,所以我們在用sleep時,要把sleep放在同步**塊的外面。
yield()
當前執行緒出讓cpu佔有權,當前執行緒變成了可執行狀態,下一時刻仍然可能被cpu選中,不會釋放鎖。
wait()和 notify()/notiyfall()
呼叫以前,當前執行緒必須要持有鎖,呼叫了wait() notify()/notiyfall()會釋放鎖。
join() 結合 執行緒池可以保證
執行緒的順序執行
executorservice executor = executors.newsinglethreadexecutor();
4 執行緒間協作和通訊
synchronized關鍵字只能修飾**塊和方法,當修飾的是靜態方法時鎖住整個類。原子性和可見性。
volatile 關鍵字 只保證執行緒可見性,應用場景單例模式的雙重校驗鎖。適合讀多寫少的場景。
執行緒同步
等待通知機制
等待超時模式
5 併發容器和併發工具類
concurrenthashmap分段鎖實現多執行緒安全。
concurrentskiplistmap treemap的併發實現
concurrentskiplistset treeset的併發實現
skiplist跳表
concurrentlinkedqueue 無界非阻塞佇列
copyonwritearraylist和copyonwritearrayset 寫的時候進行複製,可以進行併發的讀。
arrayblockingqueue: 陣列結構組成有界阻塞佇列。
先進先出原則,初始化必須傳大小,take和put時候用的同一把鎖
linkedblockingqueue:鍊錶結構組成的有界阻塞佇列
先進先出原則,初始化可以不傳大小,put,take鎖分離
併發工具類
countdownlatch
cyclicbarrier
控制併發執行緒數的semaphore
exchanger
6 executor框架的結構
1.任務的產生:runnable介面和callable介面
這2個物件屬於任務物件。工具類executors可以把乙個runnable物件封裝為callable物件。當我們擁有任務物件之後,就可以將其交給executorservice(executor的乙個實現介面)了,這樣轉入第二部分–任務處理部分。
2.任務的處理:executor介面—>executorservice介面
任務的處理主要是將任務丟到執行緒池中,由執行緒池提供執行緒將任務「消費掉」。
執行緒池有2類:threadpoolexecutor和scheduledthreadpoolexecutor。2種執行緒池類均可以通過工廠類executors來建立。
3.任務結果的獲取:future介面 或者通過completionservice來儲存返回值(結果存在阻塞佇列中)
參考:參考:
多執行緒基礎知識
建立乙個序列佇列,該佇列中從方的都是要依次執行的任務,dispatch queue serial 表示序列佇列的標示 dispatch queue t serialqueue dispatch queue create serial dispatch queue serial 建立乙個並行佇列,並行...
c 基礎知識 多執行緒
執行緒被定義為程式的執行路徑。每個執行緒都定義了乙個獨特的控制流。如果您的應用程式涉及到複雜的和耗時的操作,那麼設定不同的執行緒執行路徑往往是有益的,每個執行緒執行特定的工作。執行緒是輕量級程序。乙個使用執行緒的常見例項是現代作業系統中並行程式設計的實現。使用執行緒節省了 cpu 週期的浪費,同時提...
Java多執行緒基礎知識
一 執行緒執行狀態 1.執行緒執行狀態圖 執行緒共包括以下5種狀態。1.新建狀態 new 執行緒物件被建立後,就進入了新建狀態。例如,thread thread new thread 2.就緒狀態 runnable 也被稱為 可執行狀態 執行緒物件被建立後,其它執行緒呼叫了該物件的start 方法,...