2012-10-08 36 views
0

假設我有一個servlet,它在doPost方法中執行一些操作。另外我還有一些Connections池(讓它爲N連接)到每個請求到我的小服務器(每個請求1個連接)從池中取出的一些web服務。在doPost servlet的方法中,我從池中檢索連接,使用它(此操作可能會持續太久)並將其放回池中。向servlet訂購請求

假設N與servlet同時連接,因此將從池中檢索N連接。在請求正在處理的同時,N+1N+2請求已到達,因此它們將等待直到釋放某個連接發生(我的池由BlockingQueue支持)。

我想保證N+1請求將擁有早於N+2請求的可用連接。

我該如何做到這一點?

回答

1

ArrayBlockingQueue提供構造函數的參數來控制隊列的公平 - 當設置爲true,它保證線程將獲得隊列的元素以相同的順序,因爲他們被稱爲take()

據我所知,使用ArrayBlockingQueuefair = true作爲你游泳池的後備隊列應該足夠你的情況。

+0

ArrayBlockingQueue由固定大小的數組支持。請記住IllegalStateException。 –

+0

如果在實例化之前隊列的大小未知,該怎麼辦? – maks

+0

@maks:由於'LinkedBlockingQueue'沒有公平的選項,你必須根據公平同步原語實現你自己的阻塞隊列。見http://stackoverflow.com/questions/4046838/is-there-any-unbounded-fair-blocking-queue-in-java – axtavt