2010-04-02 44 views
3

我的系統由一個接收「請求」數據包的「代理」類組成,將它們編組並將它們通過網絡發送給服務器,服務器將它們解組,並處理並返回一些「響應數據包」。如何使用Java併發原語實現阻塞請求 - 回覆?

我的代理端的「提交」方法應該阻塞,直到收到請求的回覆(數據包有用於標識和引用目的的ID),或者直到超時。

如果我是在早期版本的Java中構建它,我可能會在我的代理中實現一組「待處理的消息ID」,我將在其中提交一條消息,並在對應的ID上使用wait() )。當收到回覆時,處理線程會通知()相應的ID。

有沒有更好的方法來實現這個使用現有的庫類,也許在java.util.concurrency?

如果我使用上述解決方案,在wait()被調用之前,處理回覆到達的潛在競爭條件的正確方法是什麼?

回答

8

簡單的方法是將Callable與服務器交談並返回響應。

// does not block 
Future<Response> response = executorService.submit(makeCallable(request)); 

// wait for the result (blocks) 
Response r = response.get(); 

管理請求隊列,爲請求分配線程以及通知客戶端代碼都被實用程序類隱藏起來。

併發的級別由執行程序服務控制。每個網絡調用都會阻塞那裏的一個線程。

爲了更好的併發性,人們可以考慮使用java.nio(但是由於您正在與所有請求的同一服務器通信,因此固定數量的併發連接,甚至可能只有一個,似乎就足夠了)。

+0

謝謝!未來似乎可能是一個可能的候選人,但我不確定這不是對這個班級的濫用。看起來響應實際上有一個超時獲得,所以這一定會有所幫助。 – Uri 2010-04-02 03:20:44