2009-04-23 79 views
0

我一直在閱讀Java中引用的描述,雖然我覺得我理解它們,但我不確定Java是否允許我執行以下操作:我們在通過套接字進行通信的相同JVM中有兩個線程,並且我們希望通過套接字傳遞大部分數據塊的地址,而無需複製數據本身。解決方案可能對啓動程序非常明顯,但我無法弄清楚!幫助將不勝感激。通過套接字傳遞(大)數據區的引用

+0

組件中的兩個套接字是以某種方式彼此分開的,比如單獨的類加載器?這是對通常在不同主機上運行的兩個程序碰巧在同一個進程中運行的特殊情況的優化嗎?我想我只是想知道爲什麼正常的參數傳遞不是一個選項。 – erickson 2009-04-23 20:55:18

+0

這裏有一堆很好的建議!感謝大家! – 2009-04-24 01:27:43

回答

1

還有什麼其他旅行在這個插座?如果它是你自己的協議,那麼在協議中添加一個動詞,說「從已知位置獲得那件大事」併發送動詞。這些物體中有多少?你可以製作一張地圖 - 字符串,對象 - 只要將字符串傳遞給套接字?

0

它可能使用JNI,但我認爲它不可能用純Java。

鑑於您處於相同的JVM中(並且這是您使其工作的唯一機會,除非您使用內存映射文件),您是否真的必須使用套接字?你不能創建更「直接」的API嗎?

0

有兩種方法可以做到這一點。

  1. 將參考放到可以稍後檢索的全球位置。通過套接字發送一個對象,該對象在解序列化時解析爲全局訪問引用。 (僅適用於相同的JVM)
  2. 使大對象可以通過RMI訪問。發送一個當序列化時創建一個RMI代理到你的大對象的對象。

使用更高效和更簡單的直接API。我建議考慮一個BlockingQueue。

1

AFAIK Java不提供獲取對象的內存引用的方法。你可能會用到的一個方法是使用一個共享數組或共享向量,將數據作爲一個對象放入到vector/array中,並通過套接字傳遞對象的索引。

0

如果您在同一個程序的兩個線程之間傳遞數據,您可以簡單地通過java.concurrent包中的任何通道將引用傳遞給該區域。

如果你正在運行2個獨立的程序,那麼你必須序列化數據(如果你真的希望數據本身通過)。

如果您只想訪問數據,您可以發佈通過RMI執行所需轉換的服務。