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循環,結束返回,如果失敗了,那就從頭開始再來一遍循環。
其他的方法以後再看。