2012-08-10 72 views
0

在從Socket連接,我需要一個Java應用程序閱讀項目(此處未進一步概述的原因)的存在像SynchronousQueue一樣的實現嗎?

  1. 輸入項目由單個線程使他們的順序被保存處理。
  2. 在處理之前要緩衝的輸入項目,以便可以從套接字中讀取新項目,而其他項目仍在處理中。
  3. 讀線程的緩衝區已滿

所以其實我想用一個工作線程對緩衝項目工作從插座接收,只要阻斷。並且在工作者線程和讀取器線程之間有一個適配隊列作爲緩衝區,這將是一種具有FIFO容量的公平的SynchronousQueue

應該表現得像與容量的ArrayBlockingQueueLinkedBlockingQueue同時不充分和類似於SynchronousQueue時充分含義

  1. put隊列將只阻塞線程如果隊列是滿所需要的隊列
  2. take如果隊列爲空,將只在隊列爲空時阻塞線程
  3. take對於完整隊列將給調用者下一個FIFO元素並解鎖並從下一個線程插入元素waitin g還put操作
  4. put對空隊列要麼交出元素線程在等待一個poll操作或將其插入

是否有這樣的任何已知的實現還是我推出我的擁有?

+1

與ArrayBlockingQueue有什麼不同? – axtavt 2012-08-10 16:31:54

+2

你能否澄清一下'ArrayBlockingQueue'的不同之處?如果沒有可用的線程,則帶有SynchronousQueue的ExecutorService不會阻塞。 – 2012-08-10 16:32:16

+0

@PeterLawrey是的你是對的! 'ThreadPoolExecutor'實際上不使用'put'而是'offer'。所以看起來,將一個ThreadPoolExecutor與一個「SynchronousQueue」一起使用一個線程是沒有任何意義的。我在文中澄清說,我必須使用自己的工作線程來重複輪詢隊列中的項目。 – Gandalf 2012-08-10 17:41:50

回答

1

一個答案,是不是隻是試圖從誰建議的ArrayBlockingQueue那些海報偷點:

兩個ArrayBlockingQueues。一個充當「池隊列」 - 在啓動時充滿緩衝區對象。另一個用於處理線程等待工作。

套接字線程在加載數據並將其排入處理線程之前,必須從該池中獲取一個緩衝區。處理完數據後,處理線程最終必須將「使用過的」對象返回到池中。如果池清空,套接字線程會阻塞,直到返回一些緩衝區。

這提供了與有界處理隊列相同的流控制,但是增加了避免緩衝區上的GC的優點。

相關問題