Selector 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
物件的多工。 SelectableChannel
[Android.Runtime.Register("java/nio/channels/Selector", DoNotGenerateAcw=true)]
public abstract class Selector : Java.Lang.Object, IDisposable, Java.Interop.IJavaPeerable, 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>
<li>
金鑰集包含代表這個選取器目前通道註冊的金鑰。 這個集合是由 方法傳 #keys() keys
回。
</李>
<li>
選取的索引鍵集是一組索引鍵,可讓每個金鑰的通道偵測到在先前選取作業期間,偵測到每個索引鍵的通道都已準備好,以取得在先前選取作業中新增索引鍵或更新金鑰的其中一個作業。 這個集合是由 方法傳 #selectedKeys() selectedKeys
回。 選取的索引鍵集一律是索引鍵集的子集。
</李>
<li>
已取消的金鑰集是已取消但通道尚未註冊的金鑰集。 此集合無法直接存取。 取消的金鑰集一律是索引鍵集的子集。
</李>
</ul>
這三個集合在新建立的選取器中都是空的。
金鑰會新增至選取器的金鑰集,作為透過通道方法註冊通道的 SelectableChannel#register(Selector,int) register
副作用。 在選取作業期間,已取消的索引鍵會從索引鍵集中移除。 索引鍵集本身無法直接修改。
在取消金鑰時,金鑰會新增至其選取器的已取消金鑰集,無論是藉由關閉其通道或叫用其 SelectionKey#cancel cancel
方法。 取消金鑰會導致下一個選取作業期間取消註冊其通道,此時會從所有選取器金鑰集中移除索引鍵。
「sks」>
索引鍵會依選取作業新增至選取的索引鍵集。 叫用集合的 方法,或 java.util.Iterator#remove() remove
叫用從集合取得的 java.util.Iterator iterator
方法,即可直接從選取的索引鍵集合 java.util.Set#remove(java.lang.Object) remove
中移除索引鍵。 叫用集合 java.util.Set#clear() clear
的 方法,即可從選取的索引鍵集合中移除所有索引鍵。 索引鍵可能不會直接新增至選取的索引鍵集。
「selop」 >< h2 > Selection < /h2>
選取作業會查詢基礎作業系統,以取得每個已註冊通道的整備程度,以執行其金鑰興趣集所識別的任何作業。 選取作業有兩種形式:
<老>
<li>
#select()
、 #select(long)
和 #selectNow()
方法會將通道的索引鍵新增至選取的索引鍵集,或更新已在選取金鑰集中的就緒作業集。
</李>
<li>
、 和 方法會在準備好執行作業的每個通道索引鍵上執行動作。 #selectNow(Consumer)
#select(Consumer, long)
#select(Consumer)
這些方法不會新增至選取的索引鍵集。
</李>
</老>
<h3 > 新增至選取索引鍵集 < /h3 的選取作業>
在每個選取作業期間,索引鍵可以新增至選取器的選取鍵集,並從其索引鍵和取消金鑰集中移除。 選取是由 、 #select(long)
和 #selectNow()
方法執行 #select()
,並包含三個步驟:
<老>
<li>
取消金鑰集中的每個索引鍵都會從屬於成員的每個索引鍵集中移除,並取消註冊其通道。 此步驟會將取消的金鑰集保留空白。
</李>
<li>
基礎作業系統會針對每個剩餘通道的整備程度進行查詢,以執行其索引鍵興趣所識別的任何作業,從選取作業開始的時間開始。 針對準備好執行至少一個這類作業的通道,會執行下列兩個動作之一:
<老>
<li>
如果通道的索引鍵尚未在選取的索引鍵集合中,則會將它新增至該集合,並修改其就緒作業集,以確切識別通道現在回報為就緒的作業。 先前在就緒集合中記錄的任何整備資訊會被捨棄。
</李>
<li>
否則通道的索引鍵已經在選取的索引鍵集合中,因此會修改其就緒作業集,以識別通道回報為就緒的任何新作業。 保留先前在就緒集中記錄的任何整備資訊;換句話說,基礎系統所傳回的就緒集合會與索引鍵的目前就緒集合位不相聯。
</李>
</老>
如果此步驟開始時金鑰集中的所有索引鍵都有空的感興趣集合,則不會更新選取的索引鍵集,也不會更新任何索引鍵的就緒作業集。
<li>
如果在步驟 (2) 進行步驟 2 時,已將任何金鑰新增至取消金鑰集,則會依照步驟 1 (1) 的方式進行處理。
</李>
</老>
選取作業是否會封鎖等候一或多個通道準備就緒,如果是多久,則為三個選取方法之間的唯一基本差異。
<h3 > 選取作業,以在選取的索引鍵 < /h3 上執行動作>
在每個選取作業期間,索引鍵可能會從選取器的索引鍵、選取機碼和取消的索引鍵集合中移除。 選取是由 、 #select(Consumer,long)
和 #selectNow(Consumer)
方法執行 #select(Consumer)
,並包含三個步驟:
<老>
<li>
取消金鑰集中的每個索引鍵都會從屬於成員的每個索引鍵集中移除,並取消註冊其通道。 此步驟會將取消的金鑰集保留空白。
</李>
<li>
基礎作業系統會針對每個剩餘通道的整備程度進行查詢,以執行其索引鍵興趣所識別的任何作業,從選取作業開始的時間開始。
對於準備好進行至少一項這類作業的通道,通道的就緒作業集會設定為識別通道就緒的作業,並叫用指定 select
給 方法的動作來取用通道的金鑰。 在叫用 動作之前,會捨棄先前在就緒集合中記錄的任何整備資訊。
或者,當通道準備好進行多個作業時,可能會多次叫用 動作 ,並將通道的索引鍵和就緒作業集修改為通道就緒作業的子集。 當 動作 針對相同的索引鍵叫用一次以上時,其就緒作業集永遠不會包含先前呼叫相同選取作業作業中 動作 的作業位。
</李>
<li>
如果在步驟 (2) 進行步驟 2 時,已將任何金鑰新增至取消金鑰集,則會依照步驟 1 (1) 的方式進行處理。
</李>
</老>
<h2 > 並行 < /h2>
選取器及其金鑰集可供多個平行線程使用。 不過,其選取的金鑰集和已取消的金鑰集不是。
選取器本身的選取作業會依照該順序,同步選取器本身的索引鍵集。 它們也會在上述步驟 (1 個) 和 (3 個) 期間同步處理已取消的金鑰集。
在選取作業進行中時,對選取器索引鍵的感興趣集合所做的變更不會影響該作業;下一個選取作業會顯示它們。
金鑰可能會取消,且通道可以隨時關閉。 因此,一或多個選取器索引鍵集中的索引鍵存在並不表示索引鍵有效或其通道已開啟。 如果另一個執行緒可能會取消索引鍵或關閉通道,應用程式程式碼應該小心同步處理和檢查這些條件。
選取作業中封鎖的執行緒可能會以下列三種方式之一遭到其他執行緒中斷:
<ul>
<li>
藉由叫用 #wakeup wakeup
選取器的方法,
</李>
<li>
叫用 #close close
選取器的方法,或
</李>
<li>
叫用封鎖執行緒 java.lang.Thread#interrupt() interrupt
的 方法,在此情況下會設定其中斷狀態,並叫用選取器 #wakeup wakeup
的方法。
</李>
</ul>
方法會 #close close
以與選取作業相同的順序,同步處理選取器及其選取索引鍵集。
「ksc」>
選取器金鑰集可供多個平行線程使用。 從金鑰集擷取作業通常不會封鎖,因此可能會與新增至集合的新註冊重迭,或是從集合中移除金鑰的選取作業取消步驟重迭。 反覆運算器和分割器會傳回元素,反映某個時間點或建立反覆運算器/分割器之後所設定的狀態。 它們不會擲回 java.util.ConcurrentModificationException ConcurrentModificationException
。
「sksc」>
選取器選取的選取金鑰集通常不是供多個平行線程使用的安全。 如果這類執行緒可能會直接修改集合,則應該藉由同步處理集合本身來控制存取權。 集合方法所傳回的 java.util.Set#iterator() iterator
反覆運算器 會失敗: 如果在建立反覆運算器之後修改集合,除了叫用反覆運算器自己的 java.util.Iterator#remove() remove
方法以外, java.util.ConcurrentModificationException
還會擲回 。
已在 1.4 中新增。
的 java.nio.channels.Selector
JAVA 檔。
此頁面的部分是根據 原始碼專案所建立和共用的工作進行修改,並根據中所述的詞彙使用。
建構函式
Selector() |
初始化這個類別的新執行個體。 |
Selector(IntPtr, JniHandleOwnership) |
建立 JNI 物件的 Managed 標記法時所使用的建構函式;由執行時間呼叫。 |
屬性
Class |
傳回這個 |
Handle |
基礎 Android 實例的控制碼。 (繼承來源 Object) |
IsOpen |
指出這個選取器是否開啟。 |
JniIdentityHashCode |
物件的多工。 |
JniPeerMembers |
物件的多工。 |
PeerReference |
物件的多工。 |
ThresholdClass |
此 API 支援 Mono for Android 基礎結構,並不適合直接從您的程式碼使用。 |
ThresholdType |
此 API 支援 Mono for Android 基礎結構,並不適合直接從您的程式碼使用。 |
方法
Clone() |
建立並傳回這個 物件的複本。 (繼承來源 Object) |
Close() |
關閉此選取器。 |
Dispose() |
物件的多工。 |
Dispose(Boolean) |
物件的多工。 |
Equals(Object) |
指出其他物件是否「等於」這個物件。 (繼承來源 Object) |
GetHashCode() |
傳回此物件的雜湊碼值。 (繼承來源 Object) |
JavaFinalize() |
當垃圾收集判斷物件沒有其他參考時,由物件上的垃圾收集行程呼叫。 (繼承來源 Object) |
Keys() |
傳回此選取器的金鑰集。 |
Notify() |
喚醒正在等候此物件的監視器的單一線程。 (繼承來源 Object) |
NotifyAll() |
喚醒正在等候此物件監視器的所有線程。 (繼承來源 Object) |
Open() |
開啟選取器。 |
Provider() |
傳回建立此通道的提供者。 |
Select() |
選取一組金鑰,其對應的通道已準備好進行 I/O 作業。 |
Select(IConsumer) |
在對應的通道準備好進行 I/O 作業的金鑰上,選取並執行動作。 |
Select(IConsumer, Int64) |
在對應的通道準備好進行 I/O 作業的金鑰上,選取並執行動作。 |
Select(Int64) |
選取一組金鑰,其對應的通道已準備好進行 I/O 作業。 |
SelectedKeys() |
傳回這個選取器的選取鍵集。 |
SelectNow() |
選取一組金鑰,其對應的通道已準備好進行 I/O 作業。 |
SelectNow(IConsumer) |
在對應的通道準備好進行 I/O 作業的金鑰上,選取並執行動作。 |
SetHandle(IntPtr, JniHandleOwnership) |
設定 Handle 屬性。 (繼承來源 Object) |
ToArray<T>() |
物件的多工。 |
ToString() |
傳回物件的字串表示。 (繼承來源 Object) |
UnregisterFromRuntime() |
物件的多工。 |
Wait() |
讓目前的執行緒等到喚醒為止,通常是藉由 < em > notified < /em > 或 < em > interrupted < /em > 來喚醒。 (繼承來源 Object) |
Wait(Int64) |
讓目前的執行緒等到喚醒為止,通常是 < 透過 em > notified < /em 或 em > interrupted < /em >> ,或 < 直到經過一定數量的即時為止。 (繼承來源 Object) |
Wait(Int64, Int32) |
讓目前的執行緒等到喚醒為止,通常是 < 透過 em > notified < /em 或 em > interrupted < /em >> ,或 < 直到經過一定數量的即時為止。 (繼承來源 Object) |
Wakeup() |
導致尚未傳回的第一個選取作業立即傳回。 |
明確介面實作
IJavaPeerable.Disposed() |
物件的多工。 |
IJavaPeerable.DisposeUnlessReferenced() |
物件的多工。 |
IJavaPeerable.Finalized() |
物件的多工。 |
IJavaPeerable.JniManagedPeerState |
物件的多工。 |
IJavaPeerable.SetJniIdentityHashCode(Int32) |
物件的多工。 |
IJavaPeerable.SetJniManagedPeerState(JniManagedPeerStates) |
物件的多工。 |
IJavaPeerable.SetPeerReference(JniObjectReference) |
物件的多工。 |
擴充方法
JavaCast<TResult>(IJavaObject) |
執行 Android 執行時間檢查的類型轉換。 |
JavaCast<TResult>(IJavaObject) |
物件的多工。 |
GetJniTypeName(IJavaPeerable) |
物件的多工。 |