IBlockingQueue 介面
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
Queue
,另外支援在擷取專案時等候佇列變成非空白的作業,並在儲存專案時等待佇列中可用的空間。
[Android.Runtime.Register("java/util/concurrent/BlockingQueue", "", "Java.Util.Concurrent.IBlockingQueueInvoker")]
[Java.Interop.JavaTypeParameters(new System.String[] { "E" })]
public interface IBlockingQueue : IDisposable, Java.Interop.IJavaPeerable, Java.Util.IQueue
[<Android.Runtime.Register("java/util/concurrent/BlockingQueue", "", "Java.Util.Concurrent.IBlockingQueueInvoker")>]
[<Java.Interop.JavaTypeParameters(new System.String[] { "E" })>]
type IBlockingQueue = interface
interface IQueue
interface ICollection
interface IIterable
interface IJavaObject
interface IDisposable
interface IJavaPeerable
- 衍生
- 屬性
- 實作
備註
Queue
,另外支援在擷取專案時等候佇列變成非空白的作業,並在儲存專案時等待佇列中可用的空間。
BlockingQueue
方法有四種形式,具有無法立即滿足的不同處理作業方式,但在未來某個時間點可能會滿足:一個擲回例外狀況,第二個會傳回特殊值( null
或 false
,視作業而定),第三個會無限期地封鎖目前線程,直到作業可以成功,而第四個區塊在放棄之前只會有指定的最大時間限制。 下表摘要說明這些方法:
<table class=“plain”>caption BlockingQueue 方法的<摘要/caption<>tr<>td/td><>< th scope=“col” style=“font-weight:normal; font-style:italic”>Throws exception</th th><scope=“col” style=“font-weight:normal; font-style:italic”>Special value</th<>th scope=“col” style=“font-weight:normal; font-style:normal; font-style:italic>”Blocks</th<>scope=“col” style=“font-weight:normal;><font-style:italic“>Times out</th/tr tr><<>th>< scope=”row“ style=”text-align:left“>Insert</th td><#add(Object) add(e)
/<>>#offer(Object, long, TimeUnit) offer(e, time, unit)
<<><<>>><#offer(Object) offer(e)
<>#put(Object) put(e)
td td/tr tr<<>>th scope=”row“ style=”text-align:left“>Remove</th><<>td>#remove() remove()
</td/td><>#poll() poll()
<><td><#take() take()
/td><td/td><#poll(long, TimeUnit) poll(time, unit)
></tr><th><scope=“row” style=“text-align:left”>Check</<>th><td<#element() element()
>/<>>#peek() peek()
<td style=“font-style: italic”>not applicable</td><td style=“font-style: italic”>not applicable</td<>/tr></table>
BlockingQueue
不接受null
專案。 實作會在嘗試 時擲回 add
NullPointerException
, put
或 offer
null
。 null
做為 sentinel 值,表示作業失敗poll
。
BlockingQueue
可能是容量系結。 在任何指定的時間,它可能會有 remainingCapacity
,除此之外,沒有任何額外的元素可以 put
沒有封鎖。 BlockingQueue
沒有任何內部容量條件約束的 Integer.MAX_VALUE
,一律會報告 的剩餘容量。
BlockingQueue
實作的設計主要用於生產者-取用者佇列,但另外支援 Collection
介面。 因此,例如,您可以使用 從佇列 remove(x)
中移除任意專案。 不過,這類作業通常<不是></em> 執行得非常有效率,而且僅供偶爾使用,例如當佇列訊息取消時。
BlockingQueue
實作是安全線程。 所有佇列方法都會使用內部鎖定或其他形式的並行控制,以不可部分完成的方式達成其效果。 不過,除非在實作中另有指定,<否則 em>bulk</em>> 集合作業 addAll
、 containsAll
retainAll
和 removeAll
不<<>一定會以不可部分完成的方式執行。 因此,例如,在 中只新增一些元素c
之後,addAll(c)
可能會失敗(擲回例外狀況)。
不會BlockingQueue
><</em> 內在支援任何類型的 ”close”或 ”shutdown”作業,表示不會再新增任何專案。 這類功能的需求和使用方式往往相依於實作。 例如,常見的策略是生產者插入特殊的 <em>end-of-stream</em> 或 <em>poison</em> 對象,這些物件會在取用者取用時據以解譯。
使用範例,以典型的生產者-取用者案例為基礎。 請注意, BlockingQueue
可以安全地與多個生產者和多個取用者搭配使用。
{@code
class Producer implements Runnable {
private final BlockingQueue queue;
Producer(BlockingQueue q) { queue = q; }
public void run() {
try {
while (true) { queue.put(produce()); }
} catch (InterruptedException ex) { ... handle ...}
}
Object produce() { ... }
}
class Consumer implements Runnable {
private final BlockingQueue queue;
Consumer(BlockingQueue q) { queue = q; }
public void run() {
try {
while (true) { consume(queue.take()); }
} catch (InterruptedException ex) { ... handle ...}
}
void consume(Object x) { ... }
}
class Setup {
void main() {
BlockingQueue q = new SomeQueueImplementation();
Producer p = new Producer(q);
Consumer c1 = new Consumer(q);
Consumer c2 = new Consumer(q);
new Thread(p).start();
new Thread(c1).start();
new Thread(c2).start();
}
}}
記憶體一致性效果:如同其他並行集合一樣,將物件放入 i>發生<前/i> 動作之後,線程中的動作會從BlockingQueue
另一BlockingQueue
<個線程中的 存取或移除該元素。
這個介面是 Java Collections Framework 的成員。
已在1.5中新增。
的 java.util.concurrent.BlockingQueue
Java 檔。
此頁面的部分是根據 Android 開放原始碼專案所建立和共用的工作進行修改,並根據 Creative Commons 2.5 屬性授權中所述的詞彙使用。
屬性
Handle |
取得基礎 Android 物件的 JNI 值。 (繼承來源 IJavaObject) |
IsEmpty |
如果不包含 |
JniIdentityHashCode |
傳回包裝實例的 值 |
JniManagedPeerState |
受控對等的狀態。 (繼承來源 IJavaPeerable) |
JniPeerMembers |
成員存取和調用支援。 (繼承來源 IJavaPeerable) |
PeerReference |
傳 JniObjectReference 回已包裝 Java 物件實例的 。 (繼承來源 IJavaPeerable) |
方法
Add(Object) |
如果可以立即執行,而不違反容量限制,在成功時傳回 ,並在目前沒有可用空間時擲 |
AddAll(ICollection) |
將指定集合中的所有專案加入至這個集合(選擇性作業)。 (繼承來源 ICollection) |
Clear() |
從這個集合中移除所有專案(選擇性作業)。 (繼承來源 ICollection) |
Contains(Object) |
如果這個佇列包含指定的專案,則傳 |
ContainsAll(ICollection) |
|
Disposed() |
處置實例時呼叫。 (繼承來源 IJavaPeerable) |
DisposeUnlessReferenced() |
如果這個實例沒有未完成的參考,則呼叫 |
DrainTo(ICollection) |
從這個佇列中移除所有可用的專案,並將其新增至指定的集合。 |
DrainTo(ICollection, Int32) |
從這個佇列中移除最多可用的項目數目,並將其新增至指定的集合。 |
Element() |
擷取但不會移除此佇列的前端。 (繼承來源 IQueue) |
Equals(Object) |
比較指定的 對象與這個集合是否相等。 (繼承來源 ICollection) |
Finalized() |
實例完成時呼叫。 (繼承來源 IJavaPeerable) |
ForEach(IConsumer) |
針對的每個項目執行指定的動作,直到處理所有專案 |
GetHashCode() |
傳回這個集合的哈希碼值。 (繼承來源 ICollection) |
Iterator() |
傳回這個集合中元素的反覆運算器。 (繼承來源 ICollection) |
Offer(Object) |
如果可以立即執行,而不違反容量限制,並在成功時傳回 |
Offer(Object, Int64, TimeUnit) |
將指定的專案插入這個佇列中,視需要等待空間可供使用,等候指定的等候時間。 |
Peek() |
擷取,但不會移除此佇列的前端,如果這個佇列是空的,則傳回 |
Poll() |
擷取並移除此佇列的前端,如果這個佇列是空的,則傳 |
Poll(Int64, TimeUnit) |
擷取並移除此佇列的前端,視需要等候元素變成可用時,等候指定的等候時間。 |
Put(Object) |
將指定的專案插入此佇列中,視需要等候空間可供使用。 |
RemainingCapacity() |
傳回此佇列在理想情況下可以接受的額外元素數目,如果沒有記憶體或資源條件約束,則為 ,如果沒有 |
Remove() |
擷取並移除此佇列的前端。 (繼承來源 IQueue) |
Remove(Object) |
如果指定的專案存在,請從這個佇列中移除指定項目的單一實例。 |
RemoveAll(ICollection) |
拿掉此集合的所有專案,這些元素也包含在指定的集合中(選擇性作業)。 (繼承來源 ICollection) |
RemoveIf(IPredicate) |
拿掉此集合中滿足指定述詞的所有專案。 (繼承來源 ICollection) |
RetainAll(ICollection) |
只保留這個集合中包含在指定集合中的專案(選擇性作業)。 (繼承來源 ICollection) |
SetJniIdentityHashCode(Int32) |
設定所 |
SetJniManagedPeerState(JniManagedPeerStates) |
|
SetPeerReference(JniObjectReference) |
設定所 |
Size() |
傳回這個集合中的項目數目。 (繼承來源 ICollection) |
Spliterator() |
|
Take() |
擷取並移除此佇列的前端,視需要等候,直到元素變成可用為止。 |
ToArray() |
傳回數位,其中包含這個集合中的所有專案。 (繼承來源 ICollection) |
ToArray(IIntFunction) |
傳回數位,其中包含這個集合中的所有專案,使用提供的 |
ToArray(Object[]) |
傳回數位,其中包含這個集合中的所有專案;傳回數位的運行時間類型是指定數位的運行時間類型。 (繼承來源 ICollection) |
UnregisterFromRuntime() |
取消註冊此實例,讓運行時間不會從未來的 Java.Interop.JniRuntime+JniValueManager.PeekValue 調用傳回它。 (繼承來源 IJavaPeerable) |
明確介面實作
IIterable.Spliterator() |
在 |
擴充方法
JavaCast<TResult>(IJavaObject) |
執行 Android 執行時間檢查的類型轉換。 |
JavaCast<TResult>(IJavaObject) |
|
GetJniTypeName(IJavaPeerable) |
|
OfferAsync(IBlockingQueue, Object) |
|
OfferAsync(IBlockingQueue, Object, Int64, TimeUnit) |
|
PollAsync(IBlockingQueue, Int64, TimeUnit) |
|
PutAsync(IBlockingQueue, Object) |
|
TakeAsync(IBlockingQueue) |
|
ToEnumerable(IIterable) |
|
ToEnumerable<T>(IIterable) |
|