1. 程式人生 > >黑馬程式設計師 – 學習Java5執行緒併發庫(4) -- 2013.1.2

黑馬程式設計師 – 學習Java5執行緒併發庫(4) -- 2013.1.2

----------- android培訓java培訓、java學習型技術部落格、期待與您交流! ------------

今天學習了一種設計方法,實現對ThreadLocal變數的封裝,讓外界不要直接操作ThreadLocal變數。

1. 對基本型別的資料進行封裝,相對少見。

2. 對物件型別的封裝,比較常見,既讓某個類針對不同執行緒分別建立一個獨立的例項物件。

學習總結了多個執行緒訪問共享變數的方式,並且針對一道面試題都實現了。

1. 如果每個執行緒執行的程式碼相同,可以使用同一個Runnable物件,這個Runnable物件中有那個共享資料以及操作共享資料的方法。比如買票系統就可以這麼做。

2. 如果每個執行緒執行的程式碼不同,這時需要不同的Runnable物件,有兩種方式可以實現。

① 將共享變數及操作共享變數的方法封裝在一個物件裡,再把物件傳遞給各個Runnable物件。

② 將共享變數和操作共享變數的方法定義在一個外部類中,把Runnable物件作為內部類。Runnable物件裡的run方法呼叫外部類中的操作共享變數的方法。

還有第三種方式就是把上面兩種方式組合起來,把共享變數及操作變數的方法都封裝在一個物件裡,把Runnable物件作為內部類,呼叫封裝物件裡的操作變數的方法。總之,要同步互斥的幾段程式碼最好是放在幾個獨立的方法中。

關於執行緒池的內容在前面已有所瞭解,今天比較系統地回顧了一遍。學習了新內容:Callable和Future。Future取得的結果型別和Callable返回的結果型別必須一致,這是通過泛型來實現的。用來提交一組Callable任務的是CompletionService,其take方法返回最先完成的一個Callable任務對應的Future物件。

附:面試題

設計4個執行緒,其中兩個執行緒每次對j增加1,另外兩個執行緒對j每次減少1,共100次,寫出程式。