JAVA思維導圖系列:多線程中級

多線程中級,包含控制線程的幾種方法、線程的同步、線程組,有返回值的線程、線程之前的通信、線程池和線程的幾個相關類






線程同步

當多個線程訪問同一資源時,加synchronized對資源進行加鎖

synchronized可以修飾代碼塊,修飾方法

只對可以改變競爭資源的方法加鎖

只有多線程纔會出現線程安全問題

釋放鎖的條件

同步方法、代碼塊結束

出現未處理的異常

調用wait,將本線程置爲就緒狀態

sleep或者yieldsuspend不會釋放同步鎖

同步鎖(Lock,顯示加鎖、釋放鎖

讀寫鎖(ReadWriteLock

可重入鎖(ReentrantLock)

對以加鎖的繼續加鎖

每一個lock方法都有一個unlock方法

死鎖

A調用B的方法、B調用A的方法

A要等B的方法執行完才能繼續執行,B要等A執行完才能繼續執行

線程組

默認情況下父線程創建子線程兩個線程就在同一線程組下

CallableFutuer

帶有返回值的"run"方法

使用FutureTask接受Callable

使用get阻塞方法得到返回值

控制線程

join

B調用Ajoin,要等A執行完畢B才執行

也就是說B的線程會阻塞

可以在構造函數裏面傳最大阻塞時間

守護進程

任務是給其他線程提供服務

當前臺進程死亡,守護進程自動死亡

例:JAVA垃圾回收線程

setDaemo設置

線程睡眠

主動進入阻塞狀態,調用Sleep方法

JDK5以後推薦同TimeUtil類睡眠

線程讓步

執行yield方法,讓當前線程設置爲就緒狀態

當在完成一個方法最重要的功能時候,可以將處理器控制權讓出去

不保證讓出去後有馬上得到處理器控制權

改變線程的優先級

setPriority 範圍爲1-10

推薦使用Thread的三個靜態常量,適合不同操作系統

線程通信

協調運行的控制策略

synchronized

wait

釋放當前線程的鎖定
例:如果消費完了,等待生產者線程將其喚醒

notify

喚醒當前等待的線程

lock

使用Condition代替同步監視功能

lock.newCondition
await 代替 wait
signal代替

管道流通信

使用new分別創建管道輸入流(PipedRead)和輸出流(PipedRead)

使用管道輸入流或管道的輸出流將對象用connent連接起來

將輸入輸出流分別傳入兩個線程

分別依賴各自的管道輸入流、管道輸出流進行通信

兩個線程分別依賴自己的管道流進行通信

線程池

Executors創建線程池

創建RunnableCallable的實例,作爲任務類

向線程池提交線程

submit(有返回值)

execute無返回值、方便Exception處理

其他工具類

ThreadLocal

線程局部變量

當前線程作爲key,要存的值爲value

從線程的角度看,每個線程完全擁有該變量

實例,HibernateFactory生成Session

每個線程獨立的改變自己的副本,和其他線程不產生衝突


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章