等待/通知機制的實現 wait,notify/notifyAll
線程進入Runnable狀態大致分爲以下5種狀況:
一、調用sleep()方法後通過的時間超過了指定的休眠時間
二、線程調用的阻塞IO已經返回,阻塞方法執行完畢
三、線程成功地得到了試圖同步的監視器
四、線程正在等待某個通知,其餘線程發出了通知
五、處於掛起狀態的線程調用了resume恢復方法
進入Runnale狀態,等待系統從新分配資源分爲5種
一、線程調用sleep方法,主動放棄佔用的處理器資源
二、線程調用了阻塞式IO方法,在該方法返回前,該線程被阻塞
三、線程試圖得到一個同步監視器,但該同步監視器正被其餘線程所持有
四、線程等待某個通知
五、程序調用了suspend方法將該線程掛起(此方法容易致使死鎖)java
yield()讓當前線程狀態改成可運行狀態,和其它線程一塊兒競爭資源
join()方法執行當前線程,並使得其餘線程處於阻塞狀態
join(long millis)方法執行當前線程millis後,再和其它線程一塊兒競爭資源
當方法wait()被執行後,鎖被自動釋放,但執行完notify()方法,鎖卻不自動釋放
wait(long)方法是指等待某一時間內是否有線程對鎖進行喚醒,若是超過這個時間則自動喚醒
java的JDK中提供了4個類來使線程間能夠進行通訊:
pipedinputstream、pipedoutputstream(字節流)、pipedreader、pipedwriter(字符流)
volatile基本數據類型從主存中取,而不是各個線程的「工做內存」,其具備可見性,但沒有併發和正確性
join和synchronized的區別:join在內部使用wait()方法進行等待,而synchronized關鍵字使用的是「對象監控器」原理爲同步
wait(long)釋放鎖,而sleep(long)不釋放鎖
ThreadLocal線程綁定本身的值,如盒子中能夠存儲每一個線程的私有數據
============JDK1.5版本以上================
ReentrantLock類的使用 在功能上比synchronized更多
ReentrantReadWriteLock類的使用
使用Condition實現等待/通知:錯誤用法與解決 await/signal
使用ReentrantLock結合Condition類是能夠實現「選擇性通知」,Condition默認提供
公平鎖表示線程獲取鎖的順序是按照線程加鎖的順序來分配的,即先來先得FIFO順序
非公平鎖是一種獲取鎖的搶佔機制,是隨機得到鎖的,先來不必定顯得鎖,也有可能某個線程一直拿不到鎖(默認)
getHoldCount()方法是查詢當前線程保持此鎖定的個數
getQueueLength()方法是查詢返回正等待獲取此鎖定的線程估計數
getWaitQueueLength()方法是查詢返回等待與此鎖定相關的給定條件Condition的線程估計數
hasQueueThread()方法是查詢指定的線程正在等待獲取此鎖定
hasWaiters(Condition condition)方法是查詢是否有線程正在等待與此鎖定有關的condition條件
isHeldByCurrentThread()的做用是查詢當前線程是否保持此鎖定
isLocked()的做用是查詢此鎖定是否由任意線程保持
lockInterruptibly()的做用是若是當前線程未被中斷,則獲取鎖定,若是已經被中斷則出現異常
tryLock()的做用是僅在調用時鎖定未被另外一個線程保持的狀況下,才獲取該鎖定
tryLock(long timeout,TimeUnit unit)的做用是若是鎖定在給定等待時間內沒有被另外一個線程保持,且當前線程
未被中斷,則獲取該鎖定
ReentrantLock具備徹底互斥排他的效果,即同一時間只有一個線程在執行ReentrantLock.lock()方法後面的任務
寫寫互斥,讀寫互斥
定時器timer
一、如何實現指定時間執行任務
二、如何實現按指定週期執行任務
TimerTask是以隊列的方式一個一個被順序執行的,因此執行的時間由可能和預期的時間不一致
schedule(TimerTask task,Date firstTime,long period)是在指定的日期以後,按指定的間隔週期性地無限循環地
執行某一任務(若是計劃時間早於當前時間,則當即執行task任務)
TimerTask類中的cancel()方法的做用是將自身從任務隊列中清除
Timer類中的cancel()方法有時並不必定會中止執行計劃任務,而是正常執行,緣由是爭取不到queue鎖
使用schedule方法:若是執行任務的時間沒有被延時,那麼下一次任務的執行時間參考的是上一次任務的「結束」時的時間來計算
schedule方法不具備追趕執行性,而scheduleAtFixedRate方法具備追趕執行性
靜態代碼塊中的代碼再使用類的時候就已經執行了
枚舉enum和靜態代碼塊的特性類似,在使用枚舉類時,構造方法會被自動調用
一、線程組的使用
二、如何切換線程狀態
三、SimpleDataFormat類與多線程的解決辦法
四、如何處理線程的異常
Thread.State
NEW:至今還沒有啓動的線程處於這種狀態
RUNNABLE:正在JAVA虛擬機中執行的線程處於這種狀態
BLOCKED:受阻塞並等待某個監視器鎖的線程處於這種狀態
WAITIME:無限期地等待另外一個線程來執行某一特定操做的線程處於這種狀態
TIME WAITIME:等待另外一個線程來執行取決於指定等待時間的操做的線程處於這種狀態
TERMINATED:已退出的線程處於這種狀態
線程組的做用是能夠批量的管理線程或線程組對象,有效地對線程或線程組對象進行組織
在實例化一個ThreadGroup線程組x時若是不指定所屬的線程組,線程組自動歸到當前線程對象所屬的線程組中
setUncaughtExceptionHandler方法是給指定線程對象設置的異常處理器
setDefaultUncaughtExceptionHandler方法是給全部線程對象設置的異常處理器編程
參照書籍來源:《Java多線程編程核心技術》多線程