一.JDK5以后的針對線程的鎖定操作和釋放操作.
同步的弊端:
A:效率低
B:容易產生死鎖
二.死鎖問題的描述
?兩個或者兩個以上的線程在爭奪資源過程中,發生的一種互相等待的現象.
三.生產者和消費者多線程的體現
舉例 :
? ? ? ? ? ?資源類;
? ? ? ? ? ?設置數據(生產者);
? ? ? ? ? ? 獲取數據(消費者);
加鎖:
? ? ? ? ? ? A:生產者和消費和都要加鎖;
? ? ? ? ? ? B:必須是同一把鎖;
等待喚醒思路:
? ? ? ? ? ? A:生產者:
? ? ? ? ? ? ? ? ? ? ?先看有沒有數據,有就等待,沒有就生產,生產完之后通知消費者來消費數據.
? ? ? ? ? ? ?B:消費者:
? ? ? ? ? ? ? ? ? ? ? ?先看有沒有數據,有就消費,沒有就等待,通知生產者生產.
等待喚醒方法:
? ? ? ? ? ?wait();等待.
? ? ? ? ? ?notify();喚醒單個線程.
? ? ? ? ? ?notifyAll();喚醒所有線程.
? ? ? ? ? ?這些方法必須通過鎖對象調用.
四.線程組
把多個線程放到一個組里.這樣比較方法操作整個組的線程.
代碼舉例:
五.線程池
線程池的好處:線程池里的每一個線程代碼結束后,并不會死亡,而是再次回到線程池中成為空閑狀態,等待下一個對象來使用.
實現線程池的步驟:
? ? ? ? ? ? ? ? ?A:創建一個線程池對象,控制需要創建幾個線程對象.
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?public static ExxcutorService newFixedThreadPool(int nThreads);
? ? ? ? ? ? ? ? ?B:這種線程池的線程可以執行:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Runnable對象或者Callable對象代表的線程
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 做一個類實現Runnable接口.
? ? ? ? ? ? ? ? C:調用如下方法即可.
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?submit(Runnable task);
代碼舉例:
六.線程常見情況
* A:新建--就緒--運行--死亡
* B:新建--就緒--運行--就緒--運行--死亡
* C:新建--就緒--運行--其他阻塞--就緒--運行--死亡
* D:新建--就緒--運行--同步阻塞--就緒--運行--死亡
* E:新建--就緒--運行--等待阻塞--同步阻塞阻塞--就緒--運行--死亡