future

java6 實現和java7及以上是不一樣的

java6使用了aqs,而後者並沒有

java7實現



futuretask

主要看awaitDone run removeWaiter 3個方法

get獲取的結果的時候會阻塞 調用awaitDone,會創建一個等待節點,多個線程同時get會形成一個鏈表,然後使用locksupport阻塞。

run方法執行完會使用locksupport喚醒,然後調用removeWaiter,移除等待節點,

移除的時候維護了pre q s3個節點,寫的很奇妙,q表示當前遍歷到的節點,另外兩個代表前後,如果q節點所代表線程是空的,那麼看前面的節點,如果前面一個pre不爲空,那就直接pre-next-s,將q去掉了,去掉的時候如果pre代表的線程也是空的(併發的情況下),那就從頭開始再來一遍循環,如果如果前面一個pre爲空,說明q是頭結點,用cas操作將頭結點設置爲s,如果成功了break循環,結束返回,如果失敗了,那就從頭開始再來一遍循環。

其他的方法以後再看。

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