2012-09-06 161 views
0

因此,繼承人我目前的Java實現:FIFO隊列發送請求,並等待響應

  1. 使用一個線程從UDP套接字接收UDP包,就把包成非阻塞隊列。
  2. 300個線程之一讀取此非阻塞隊列,並將此數據包作爲對連接到TCP主機/端口的Socket的請求處理。
  3. 等待響應並將其返回給UDP套接字。

這部分內容一切正常,但是從高負載下TCP套接字部分的分析,我發現在隨機的情況下,TCP套接字部分可能需要大約2-5秒才能完成。通常這部分需要2-3毫秒。我的問題是,我只是用隨機線程執行命中TCP Socket,並且沒有線程操作的FIFO。

有沒有一種方法可以將'請求'信息和當前線程引用(我想知道哪個線程處理'響應')放入一個FIFO阻塞隊列中,以確保最早處理最早的線程以確保TCP套接字請求/響應操作需要最少的時間。

+0

各個線程是否阻止了TCP操作?還是你安排他們是非阻塞的?如果是這樣,怎麼樣? –

+0

爲什麼?你怎麼知道這樣排序會改變TCP響應時間?當UDP本身無序時,爲什麼順序很重要? – EJP

+0

我希望你的盒子裏有300個核心。 –

回答

0

有沒有一種方法,我可以放置「請求」信息加上當前線程參考

我將有一個AtomicLong請求計數器會得到增加爲每個請求。然後,計數器將與請求映射中的UDP套接字以及任何其他每個請求信息相關聯。計數器也將通過TCP套接字發送。來自TCP套接字的響應將返回請求計數器,並且讀取器線程將通過適當的UDP套接字將響應發回或者將其安排在線程池中。

一旦你有請求計數器,那麼TCP套接字將是一個請求/響應流,以便它們可以按需發送。一個線程將向遠程服務器發送請求,另一個線程將讀取響應並將響應安排回UDP客戶端。如有必要,你可以保證FIFO的順序,但如果另一個響應已經準備就緒,我不明白爲什麼它必須等待,因爲它已經失靈。

在服務器端,您將有一個類似的讀取器和寫入器線程,都從工作隊列中消耗。

0

我相信你在尋找一個ConcurrentLinkedQueue - 這是它的描述,我的一些重點。

無界限線程安全隊列基於鏈接的節點。此隊列命令元素FIFO(先進先出)。隊列中的是已在隊列中的元素最長時間爲。隊列中的尾部是已經在隊列上的元素的最短時間。新元素插入到隊列尾部,隊列檢索操作獲取隊列頭部的元素。 ConcurrentLinkedQueue是一個合適的選擇,當許多線程將共享對一個公共集合的訪問時。這個隊列的確不允許爲元素。

相關問題