2009-04-23 71 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执行所需转换的服务。