DelayQueue-我是/不是不完整的 在某些情況下,存放在Queue中的對象,在它們準備被取出之前,會需要被放在另一Queue中一段時間。這時你可使用java.util.concurrent.DelayQueue類,他實作類別BlockingQueue介面。DelayQueue需要Queue對象被駐留在Queue上一段指定時間。 我想用來證實它的現執行個體子(這可能是你非常渴望的)是關於鬆餅(muffins)。噢,Muffin對象(象我們正在談論的Java-沒有coffee雙關意圖)。假定你有一個DelayQueue並在其中放了一些Muffin對象。Muffin對象(如下所示)必須實現java.util.concurrent.Delayed介面,以便可被放在DelayQueue中。這個介面需要Muffin對象實現getDelay方法(如下所示)。getDelay方法,實際上聲明給多長時間讓對象儲存在DelayQueue中。當該方法返回的值變為0或小於0時,對象就準備完畢(或在本例子中,是烤制完畢)並允許被取出(見Listing 3)。 Muffin類也實現compareTo(java.util.concurrent.Delayed)方法。由於Delayed介面繼承自java.lang.Comparable類,這通過約定限制你要實現Muffin對象的bakeCompletion時間。 由於你不是真想去吃沒有完全烤熟的Muffin,因此,需要將Muffin放在DelayQueue中存放推薦的烤制時間。Listing 4,取自DelayQueueUsageExample類,展示了從DelayQueue中enqueue和dequeue Muffin對象。 如你所見,對Muffin對象的烤制時間是使用它的構造器設定的(構造器期望烤制時間是以秒計)。 如前所講,Muffin對象放到DelayQueue中是不允許被取出的,直到他的延時時間(又叫烤制時間)超期。元素被從Queue中取出基於最早的延時時間。在本例中,如果你有一些已經烤過的Muffin對象,他們將按他們已經等待多久而被取出(換句話說,最早被烤制的Muffin會在新烤制的Muffin之前被取出)。 SynchronousQueue 在Java 1.5中,另外一種阻塞Queue實現是SynchronousQueue。相當有趣的是,該Queue沒有內在容量。這是故意的,因為Queue意在用於傳遞目的。這意味著,在一個同步Queue結構中,put請求必須等待來自另一線程的給SynchronousQueue的take請求。同時,一個take請求必須等待一個來自另一線程的給SynchronousQueue的put請求。用程式來樣本此概念,可參見範例程式碼。類似於前邊的LinkedBlockingQueue例子,它包含一個consumer(SynchConsumer),見Listing 5。 Listing 5中的代碼使用SynchronousQueue類的poll(long timeout,TimeUnit unit)方法。此方法允許poll過程在厭倦等待另一消費線程寫SynchronousQueue之前等待一個指定時間(本例中是20秒)。 在Listing 6中的producer(SynchProducer)使用相似的offer(E o,long timeout, TimeUnit unit)方法去放置對象到SynchronousQueue中。使用此方法允許在厭倦等待另一線程去讀取SynchronousQueue之前等待一段時間(本例中為10秒)。 TestSynchQueue 展示了producer和consumer的動作: import java.util.concurrent.SynchronousQueue;import java.util.concurrent.LinkedBlockingQueue;public class TestSynchQueue{ public static void main(String args[]) { SynchronousQueue<String> synchQueue = new SynchronousQueue<String>(); SynchProducer producer = new SynchProducer("ProducerA",synchQueue, System.out); SynchConsumer consumerA = new SynchConsumer("ConsumerA", synchQueue, System.out); consumerA.start(); producer.start(); }}
當試圖明白隱藏在SynchronousQueue後面的概念時,要牢記這些Queue通常被使用在什麼地方。JavaDoc中關於同步Queue指出: "它們[同步Queue]是適合於傳遞設計,在那裡運行在一個線程中的對象必須與運行在另外一個線程中的對象同步以便於交給它一些資訊,時間或任務。" 作者簡介: Kulvir Singh Bhogal 是為IBM工作的顧問, 規劃並實現在客戶網站上的Java-centric解決方案. |