Selector 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
一個物件 SelectableChannel 的多工器。
[Android.Runtime.Register("java/nio/channels/Selector", DoNotGenerateAcw=true)]
public abstract class Selector : Java.Lang.Object, IDisposable, Java.IO.ICloseable
[<Android.Runtime.Register("java/nio/channels/Selector", DoNotGenerateAcw=true)>]
type Selector = class
inherit Object
interface ICloseable
interface IJavaObject
interface IDisposable
interface IJavaPeerable
- 繼承
- 衍生
- 屬性
- 實作
備註
一個物件 SelectableChannel 的多工器。
選擇器可透過呼叫 #open open 此類別的方法建立,該方法會利用系統的預設 java.nio.channels.spi.SelectorProvider selector provider 值建立新的選擇器。 選擇器也可透過呼叫 java.nio.channels.spi.SelectorProvider#openSelector openSelector 自訂選擇器提供者的方法來建立。 選擇器會保持開啟狀態,直到透過其 #close close 方法關閉。
「KS」>
可選通道與選擇器的註冊以物件表示 SelectionKey 。 選擇器維護三組選擇鍵:
<UL>
<李>
金鑰集包含代表此選擇器目前通道註冊的金鑰。 此集合由方法回傳 #keys() keys 。
</李>
<李>
選取金鑰集合是指在先前選擇操作中,該操作新增或更新金鑰時,偵測到每個金鑰通道至少準備好進行該金鑰興趣集中識別的其中一個操作的金鑰集合。 此集合由方法回傳 #selectedKeys() selectedKeys 。 選中鍵集合總是金鑰集的子集。
</李>
<李>
取消金鑰集合是指已被取消但通道尚未被取消的金鑰集合。 此套組無法直接取得。 取消鍵集合總是鍵集合的子集。
</李>
</ul>
這三組在新建立的選擇器中皆為空。
在選擇器的鍵組中,作為透過通道 SelectableChannel#register(Selector,int) register 方法註冊通道的副作用,會加入金鑰。 取消的鍵會在選擇操作中從鍵組中移除。 金鑰集本身無法直接修改。
當取消時,無論是關閉通道還是呼叫方法 SelectionKey#cancel cancel ,都會將鍵加入其選擇器的取消鍵集合。 取消金鑰會導致其通道在下一次選擇操作中被取消註冊,屆時該金鑰會從所有選擇器的金鑰集中移除。
「sks」>
鍵數是透過選取操作加入 select-key 集合的。 可直接從選取的金鑰集合中移除金鑰,方法是調用該集合的方法 java.util.Set#remove(java.lang.Object) remove ,或 java.util.Iterator#remove() remove 是從該集合中取得的方法 java.util.Iterator iterator 。 所有鍵可透過調用該集合的方法 java.util.Set#clear() clear 從選取的鍵集合中移除。 金鑰不得直接加入選中的金鑰集合。
“selop”h2><> Selection</h2>
選擇操作會查詢底層作業系統,查詢每個註冊通道是否準備好執行其金鑰興趣集所識別的任一操作。 選擇操作有兩種形式:
<進攻線>
<李>
#select()這些 、 #select(long)和 #selectNow() 方法將準備執行操作的通道鍵加入選中鍵組,或更新已在選中鍵組中的準備操作鍵組。
</李>
<李>
這些 #select(Consumer)、 #select(Consumer, long)和 #selectNow(Consumer) 方法對每個準備執行操作的通道的鍵執行 動作 。 這些方法不會增加選取鍵的集合。
</李>
</ol>
<h3>增加選取鍵集合</h3 的選取操作>
在每次選擇操作中,鍵可以新增或移除選擇器的選中鍵組,也可以從鍵組和取消鍵組中移除。 選擇由 #select()、 #select(long)和 #selectNow() 方法執行,包含三個步驟:
<進攻線>
<李>
取消金鑰集中的每個金鑰都會從其所屬的金鑰集中移除,該通道也會被取消註冊。 此步驟會使取消金鑰集合為空。
</李>
<李>
底層作業系統會被查詢更新,以了解每個剩餘通道是否準備好執行其金鑰興趣集所識別的任何操作,截至選擇操作開始的那一刻。 對於一個已準備好進行至少一個此類操作的通道,會執行以下兩個動作之一:
<進攻線>
<李>
若通道的金鑰尚未在 select-key 集合中,則將其加入該集合,並修改其準備操作集以精確識別通道目前被報告為已準備好的操作。 先前在備用集中記錄的任何準備資訊都會被捨棄。
</李>
<李>
否則通道的金鑰已在選中金鑰集中,因此其準備操作集會被修改,以識別任何被報告為已準備好的新操作。 先前在備戰集中記錄的任何準備資訊都會被保留;換句話說,底層系統回傳的準備集會以位元分離方式,與金鑰目前的準備集相連。
</李>
</ol>
如果此步驟開始時,鍵組中的所有鍵都是空的興趣集,則無論是 Select-key 集合還是任何鍵的準備操作集,都不會被更新。
<李>
若在步驟(2)進行中新增任何金鑰,則依步驟(1)處理。
</李>
</ol>
選擇操作是否會阻擋等待一個或多個通道準備好,以及等待多久,這是三種選擇方法之間唯一的本質差異。
<h3>對所選鍵<執行動作的選擇操作 / h3>
在每次選擇操作中,可以從選擇器的鍵、選取鍵和取消鍵組中移除鍵。 選擇由 #select(Consumer)、 #select(Consumer,long)和 #selectNow(Consumer) 方法執行,包含三個步驟:
<進攻線>
<李>
取消金鑰集中的每個金鑰都會從其所屬的金鑰集中移除,該通道也會被取消註冊。 此步驟會使取消金鑰集合為空。
</李>
<李>
底層作業系統會被查詢更新,以了解每個剩餘通道是否準備好執行其金鑰興趣集所識別的任何操作,截至選擇操作開始的那一刻。
對於一個至少準備好執行一個此類操作的通道,通道金鑰的準備操作集合會被設定為精確識別通道已準備好的操作,並呼叫該方法指定的select來消耗通道的金鑰。 在呼叫動作前,任何先前記錄於準備集的準備資訊都會被丟棄。
或者,當一個通道準備好執行多個操作時,該 動作 可能會被多次呼叫,並將通道的金鑰與準備操作集修改為該通道已準備好的操作子集。 若同一鍵呼叫該動作超過一次,則其準備操作集合中不會包含先前同一選擇操作呼叫時所包含的操作位元。
</李>
<李>
若在步驟(2)進行中新增任何金鑰,則依步驟(1)處理。
</李>
</ol>
<h2>並行</h2>
選擇器及其金鑰集可被多個並行執行緒安全使用。 然而,其已選鍵集合與取消鍵集合則不然。
選取操作會依此順序在選擇器本身、選取鍵集合上同步。 它們也會在上述步驟(1)和(3)中同步取消的鍵組。
在選擇操作進行中對選擇鍵的興趣集所做的變更,對該操作不影響;他們會在下一次選拔手術中被看到。
金鑰可隨時取消或關閉頻道。 因此,選擇器金鑰集中出現一個或多個金鑰,並不代表該金鑰有效或通道是開放的。 應用程式程式碼應謹慎同步並檢查這些條件,以防其他執行緒可能取消金鑰或關閉通道。
在選擇操作中被阻塞的執行緒可能會被其他執行緒以三種方式之一中斷:
<UL>
<李>
透過呼叫選擇者 #wakeup wakeup 的方法,
</李>
<李>
透過呼叫選擇器的方法 #close close ,或
</李>
<李>
透過呼叫被阻塞執行緒的方法 java.lang.Thread#interrupt() interrupt ,則會設定其中斷狀態,並呼叫選擇執行緒的方法 #wakeup wakeup 。
</李>
</ul>
此 #close close 方法在選擇器與其 select-key 集合上同步,順序與選擇操作相同。
「KSC」>
選擇器的金鑰集可被多個並行執行緒安全使用。 從金鑰集的檢索操作通常不會阻塞,因此可能會與新增的註冊重疊,或與移除金鑰的選擇操作的取消步驟重疊。 迭代器與分割器回傳反映集合在建立時或自創建以來的狀態的元素。 他們不會投擲 java.util.ConcurrentModificationException ConcurrentModificationException。
「SKSC」>
選擇器的 select-key 集合一般來說不適合多個並行執行緒使用。 若執行緒可能直接修改集合,則應透過同步於集合本身來控制存取。 該集合 java.util.Set#iterator() iterator 方法回傳的迭代器是 失敗快速的: 若在迭代器建立後以任何方式修改集合,除非調用迭代器自身 java.util.Iterator#remove() remove 的方法,則會拋出 a java.util.ConcurrentModificationException 。
在 1.4 版本加入。
Java 文件 java.nio.channels.Selector。
本頁部分內容為基於 Open Source Project 所創建與分享的作品,並依授權條款所描述的使用進行修改。
建構函式
| 名稱 | Description |
|---|---|
| Selector() |
初始化此類別的新實例。 |
| Selector(IntPtr, JniHandleOwnership) |
用於建立 JNI 物件受管理表示的建構器;由執行時呼叫。 |
屬性
| 名稱 | Description |
|---|---|
| Class |
回傳此 |
| Handle |
底層 Android 實例的帳號。 (繼承來源 Object) |
| IsOpen |
顯示此選擇器是否開啟。 |
| JniIdentityHashCode |
取得由互通執行時指派給此 Java 對等端的身份雜湊碼。 (繼承來源 Object) |
| JniManagedPeerState |
一個物件 |
| JniPeerMembers |
一個物件 |
| PeerReference |
取得這個 Java 節點的 JNI 物件參考。 (繼承來源 Object) |
| ThresholdClass |
此 API 支援 Mono for Android 基礎架構,並非直接從你的程式碼中使用。 |
| ThresholdType |
此 API 支援 Mono for Android 基礎架構,並非直接從你的程式碼中使用。 |
方法
| 名稱 | Description |
|---|---|
| Clone() |
建立並回傳此物件的副本。 (繼承來源 Object) |
| Close() |
關閉這個選擇器。 |
| Construct(JniObjectReference, JniObjectReferenceOptions) |
一個物件 |
| Dispose() |
釋放該 Java 節點所持有的資源。 (繼承來源 Object) |
| Dispose(Boolean) |
釋放該 Java 節點所持有的資源。 (繼承來源 Object) |
| DisposeUnlessReferenced() |
一個物件 |
| Equals(Object) |
一個物件 |
| Equals(Object) |
表示是否有其他物體「等同」於此物。 (繼承來源 Object) |
| GetHashCode() |
回傳物件的雜湊碼值。 (繼承來源 Object) |
| JavaFinalize() |
當垃圾回收判定該物件不再有相關參考時,由垃圾回收器呼叫。 (繼承來源 Object) |
| Keys() |
回傳此選擇器的鍵組。 |
| Notify() |
喚醒一個正在該物件監視器上等待的執行緒。 (繼承來源 Object) |
| NotifyAll() |
喚醒所有等待該物件監視器的執行緒。 (繼承來源 Object) |
| Open() |
打開選擇器。 |
| Provider() |
回傳創建此通道的提供者。 |
| Select() |
選擇一組金鑰,其對應通道已準備好進行 I/O 操作。 |
| Select(IConsumer, Int64) |
選擇並執行對應通道已準備好進行輸入輸出操作的金鑰的操作。 |
| Select(IConsumer) |
選擇並執行對應通道已準備好進行輸入輸出操作的金鑰的操作。 |
| Select(Int64) |
選擇一組金鑰,其對應通道已準備好進行 I/O 操作。 |
| SelectedKeys() |
回傳此選擇器的 select-key 集合。 |
| SelectNow() |
選擇一組金鑰,其對應通道已準備好進行 I/O 操作。 |
| SelectNow(IConsumer) |
選擇並執行對應通道已準備好進行輸入輸出操作的金鑰的操作。 |
| SetHandle(IntPtr, JniHandleOwnership) |
設定 Handle 屬性。 (繼承來源 Object) |
| SetPeerReference(JniObjectReference, JniObjectReferenceOptions) |
一個物件 |
| ToArray<T>() |
從這個 Java 陣列包裝器建立一個受管理陣列。 (繼承來源 Object) |
| ToString() |
回傳物件的字串表示。 (繼承來源 Object) |
| UnregisterFromRuntime() |
將此 Java 節點從互通執行時中取消註冊。 (繼承來源 Object) |
| Wait() |
導致目前執行緒等待被喚醒,通常是透過 <em>通知</><em 或 em>中斷</em> 來喚醒。 (繼承來源 Object) |
| Wait(Int64, Int32) |
會讓目前執行緒等待喚醒,通常是透過 <em>通知</><em 或 em>中斷</em>,或是經過一定的真實時間。 (繼承來源 Object) |
| Wait(Int64) |
會讓目前執行緒等待喚醒,通常是透過 <em>通知</><em 或 em>中斷</em>,或是經過一定的真實時間。 (繼承來源 Object) |
| Wakeup() |
會使尚未返回的第一個選擇操作立即返回。 |
明確介面實作
| 名稱 | Description |
|---|---|
| IJavaPeerable.Disposed() |
一個物件 |
| IJavaPeerable.Finalized() |
一個物件 |
| IJavaPeerable.JniObjectReferenceControlBlock |
一個物件 |
| IJavaPeerable.SetJniIdentityHashCode(Int32) |
一個物件 |
| IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
一個物件 |
| IJavaPeerable.SetPeerReference(JniObjectReference) |
一個物件 |
| IJavaPeerable.UnregisterFromRuntime() |
一個物件 |
擴充方法
| 名稱 | Description |
|---|---|
| GetJniTypeName(IJavaPeerable) |
取得實例 |
| JavaAs<TResult>(IJavaPeerable) |
試著強制 |
| JavaCast<TResult>(IJavaObject) |
執行 Android 執行時檢查型別轉換。 |
| JavaCast<TResult>(IJavaObject) |
一個物件 |
| TryJavaCast<TResult>(IJavaPeerable, TResult) |
試著強制 |