java多執行緒JDK1 5 二

2021-08-30 01:55:44 字數 4838 閱讀 8061

5、

public classexecutorcompletionservice
extends

object implements

completionservice

使用提供的executor來執行任務的completionservice。此類將安排那些完成時提交的任務,把它們放置在可使用 take 訪問的佇列上。該類非常輕便,適合於在執行幾組任務時臨時使用。 

用法示例。假定您有針對某個問題的一組求解程式,每個求解程式都能返回某種型別的 result 值,並且您想同時執行它們,使用方法 use(result r) 處理返回非 null 值的每個求解程式的返回結果。可以這樣編寫程式:

void solve(executor e, collection> solvers)

throws interruptedexception, executionexception

}

假定您想使用任務集中的第乙個非 null 結果,而忽略任何遇到異常的任務,並且在第乙個任務就緒時取消其他所有任務:

void solve(executor e, collection> solvers) 

throws interruptedexception

} catch(executionexception ignore) {}}}

finally

if (result != null)

use(result);

}

6、
public inte***cecompletionservice
將生產新的非同步任務與使用已完成任務的結果分離開來的服務。生產者 submit 執行的任務。使用者 take 已完成的任務,並按照完成這些任務的順序處理它們的結果。例如,completionservice 可以用來管理非同步 io ,執行讀操作的任務作為程式或系統的一部分提交,然後,當完成讀操作時,會在程式的不同部分執行其他操作,執行操作的順序可能與所請求的順序不同。 

通常,completionservice 依賴於乙個單獨的executor來實際執行任務,在這種情況下,completionservice 只管理乙個內部完成佇列。executorcompletionservice類提供了此方法的乙個實現。

7、

public inte***celock
lock 實現提供了比使用 synchronized 方法和語句可獲得的更廣泛的鎖定操作。此實現允許更靈活的結構,可以具有差別很大的屬性,可以支援多個相關的condition物件。 

鎖定是控制多個執行緒對共享資源進行訪問的工具。通常,鎖定提供了對共享資源的獨佔訪問。一次只能有乙個執行緒獲得鎖定,對共享資源的所有訪問都需要首先獲得鎖定。不過,某些鎖定可能允許對共享資源併發訪問,如readwritelock的讀取鎖定。

synchronized 方法或語句的使用提供了對與每個物件相關的隱式監視器鎖定的訪問,但卻強制所有鎖定獲取和釋放均要出現在乙個塊結構中:當獲取了多個鎖定時,它們必須以相反的順序釋放,且必須在與所有鎖定被獲取時相同的詞法範圍內釋放所有鎖定。

雖然 synchronized 方法和語句的範圍機制使得使用監視器鎖定程式設計方便了很多,而且還幫助避免了很多涉及到鎖定的常見程式設計錯誤,但有時也需要以更為靈活的方式使用鎖定。例如,某些遍歷併發訪問的資料結果的演算法要求使用 "hand-over-hand" 或 "chain locking":獲取節點 a 的鎖定,然後再獲取節點 b 的鎖定,然後釋放 a 並獲取 c,然後釋放 b 並獲取 d,依此類推。lock 介面的實現允許鎖定在不同的作用範圍內獲取和釋放,並允許以任何順序獲取和釋放多個鎖定,從而支援使用這種技術。

lock l = ...; 

l.lock();

try finally

鎖定和取消鎖定出現在不同作用範圍中時,必須謹慎地確保保持鎖定時所執行的所有**用 try-finally 或 try-catch 加以保護,以確保在必要時釋放鎖定。

lock 實現提供了使用 synchronized 方法和語句所沒有的其他功能,包括提供了乙個非塊結構的獲取鎖定嘗試 (trylock())、乙個獲取可中斷鎖定的嘗試 (lockinterruptibly()) 和乙個獲取超時失效鎖定的嘗試 (trylock(long, timeunit))。

lock 類還可以提供與隱式監視器鎖定完全不同的行為和語義,如保證排序、非重入用法或死鎖檢測。如果某個實現提供了這樣特殊的語義,則該實現必須對這些語義加以記錄。

注意,lock 例項只是普通的物件,其本身可以在 synchronized 語句中作為目標使用。獲取 lock 例項的監視器鎖定與呼叫該例項的任何lock()方法沒有特別的關係。為了避免混淆,建議除了在其自身的實現中之外,決不要以這種方式使用 lock 例項。

除非另有說明,否則為任何引數傳遞 null 值都將導致丟擲nullpointerexception

所有 lock 實現都必須 實施與內建監視器鎖定提供的相同記憶體同步語義:

不成功的鎖定與取消鎖定操作以及重入鎖定/取消鎖定操作都不需要任何記憶體同步效果。

三種形式的鎖定獲取(可中斷、不可中斷和定時)在其效能特徵、排序保證或其他實現質量上可能會有所不同。而且,對於給定的 lock 類,可能沒有中斷正在進行的 鎖定獲取的能力。因此,並不要求實現為所有三種形式的鎖定獲取定義相同的保證或語義,也不要求其支援中斷正在進行的鎖定獲取。實現必需清楚地對每個鎖定方法所提供的語義和保證進行記錄。還必須遵守此介面中定義的中斷語義,以便為鎖定獲取中斷提供支援:完全支援中斷,或僅在進入方法時支援中斷。

由於中斷通常意味著取消,而通常又很少進行中斷檢查,因此,相對於普通方法返回而言,實現可能更喜歡響應某個中斷。即使出現在另乙個操作後的中斷可能會釋放執行緒鎖定時也是如此。實現應記錄此行為。

8、

public inte***cecondition
condition 將 object 監視器方法(waitnotifynotifyall)分解成截然不同的物件,以便通過將這些物件與任意lock實現組合使用,為每個物件提供多個等待 set (wait-set)。其中,lock 替代了 synchronized 方法和語句的使用,condition 替代了 object 監視器方法的使用。 

條件(也稱為條件佇列 或條件變數)為執行緒提供了乙個含義,以便在某個狀態條件現在可能為 true 的另乙個執行緒通知它之前,一直掛起該執行緒(即讓其「等待」)。因為訪問此共享狀態資訊發生在不同的執行緒中,所以它必須受保護,因此要將某種形式的鎖定與該條件相關聯。等待提供乙個條件的主要屬性是:以原子方式 釋放相關的鎖定,並掛起當前執行緒,就像 object.wait 做的那樣。

condition 例項實質上被繫結到乙個鎖定上。要為特定lock例項獲得 condition 例項,請使用其newcondition()方法。

例項來做到這一點。

class boundedbuffer  finally }

public object take() throws interruptedexception finally }

}

arrayblockingqueue類提供了這項功能,因此沒有理由去實現這個示例類。)

condition 實現可以提供不同於 object 監視器方法的行為和語義,比如受保證的通知排序,或者在執行通知時不需要保持乙個鎖定。如果某個實現提供了這樣特殊的語義,則該實現必須記錄這些語義。

注意,condition 例項只是一些普通的物件,它們自身可以用作 synchronized 語句中的目標,並且可以呼叫自己的waitnotification監視器方法。獲取 condition 例項的監視器鎖定或者使用其監視器方法,與獲取和該 condition 相關的lock或使用其waitingsignalling方法沒有什麼特定的關係。為了避免混淆,建議除了在其自身的實現中之外,切勿以這種方式使用 condition 例項。

除非另行說明,否則為任何引數傳遞 null 值將導致丟擲nullpointerexception

在等待 condition 時,允許發生「虛假喚醒」,這通常作為對基礎平台語義的讓步。對於大多數應用程式,這帶來的實際影響很小,因為 condition 應該總是在乙個迴圈中被等待,並測試正被等待的狀態宣告。某個實現可以隨意移除可能的虛假喚醒,但建議應用程式程式設計師總是假定這些虛假喚醒可能發生,因此總是在乙個迴圈中等待。

三種形式的條件等待(可中斷、不可中斷和超時)在一些平台上的實現以及它們的效能特徵可能會有所不同。尤其是它可能很難提供這些特性和維護特定語義,比如排序保證。更進一步地說,中斷執行緒實際掛起的能力在所有平台上並不是總是可行的。

因此,並不要求某個實現為所有三種形式的等待定義完全相同的保證或語義,也不要求其支援中斷執行緒的實際掛起。

要求實現清楚地記錄每個等待方法提供的語義和保證,在某個實現不支援中斷執行緒的掛起時,它必須遵從此介面中定義的中斷語義。

由於中斷通常意味著取消,而又通常很少進行中斷檢查,因此實現可以先於普通方法的返回來對中斷進行響應。即使出現在另乙個操作後的中斷可能會釋放執行緒鎖定時也是如此。實現應記錄此行為。

JDK1 5的可變引數

乙個方法接收的引數個數不固定。可變引數的特點 1 只能出現在引數列表的最後 2 位於變數型別和變數名之間。前後有空格都可以。3 呼叫可變引數的方法時,編譯器為該可變引數隱含建立乙個陣列,在方法體中以陣列的形式訪問可變引數。例如 package com.howlaa.day02 public clas...

JDK1 5的拆裝箱

integer i1 100 integer i2 100 integer i3 200 integer i4 200 integer類內部有乙個快取,其實就是乙個integer,大小為256,它儲存了 128 127之間的所有integer物件。當使用valueof 100 方法時,該方法判斷10...

JDK1 5的新特性

1.靜態匯入 靜態匯入得是靜態方法或靜態類 2.可變引數 overload與override的區別 overload是過載,override是重寫 可變引數就是overload 可變引數的特點 1.可變引數中的.只能出現在引數列表的最後 2.可變引數中的.位於變數型別和變數名之間,前後有無空格都可以...