Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中数据的轮询对象_Java_Select - Fatal编程技术网

Java中数据的轮询对象

Java中数据的轮询对象,java,select,Java,Select,我有许多PacketConnection对象连接到远程计算机。每个PacketConnection都有线程安全的(synchronized)读写方法,可以接受数据包。其他类不应访问封闭的流 我希望在PacketConnection有数据要读取时通知连接的所有者(它可能会阻塞,直到发生事件;在while循环中旋转CPU显然是不需要的)。然后,所有者将要求适当的对象读取并返回一个数据包 实现这一点的最自动化的方法是什么?使用Java NIO访问“选择器”功能,告诉您哪些套接字具有您可以读取的数据。表

我有许多
PacketConnection
对象连接到远程计算机。每个
PacketConnection
都有线程安全的(
synchronized
)读写方法,可以接受
数据包。其他类不应访问封闭的流

我希望在
PacketConnection
有数据要读取时通知连接的所有者(它可能会阻塞,直到发生事件;在while循环中旋转CPU显然是不需要的)。然后,所有者将要求适当的对象读取并返回一个
数据包


实现这一点的最自动化的方法是什么?

使用Java NIO访问“选择器”功能,告诉您哪些套接字具有您可以读取的数据。表示可选择的套接字。然后在上调用
select()
,以确定是否有任何套接字可读;如有必要,您可以提供选择超时。

但如何触发事件?每个
PacketConnection
都不应该有自己的线程。呃,它怎么知道什么时候有数据要读取呢?在C语言中,我可以有几个套接字并对所有套接字调用
select
<代码>选择
将在有一个或多个数据时返回。我如何在Java中实现同样的想法,但是使用任意对象?可能类似于a?这不是等待计算完成的未来吗?请显示一些代码,和/或指向您想要指向的类的链接。这不是一个完整的答案,因为它是。+1非常好的答案,没有汤匙饲料必要。这并不是一个完整的问题,因为它是IMHO。接下来的一个问题:
SocketChannel
对于我所描述的内容确实非常有效。您甚至可以通过函数调用从中获取传统流。然而,我没有提到我需要一个支持SSL的套接字(我认为这是一个微不足道的改变)。这不是小事;您必须使用
SSLEngine
手动管理SSL状态机。就我的应用程序的规模而言,最多只有几十个连接,只需为每个连接使用一个阻塞线程就可以少很多麻烦(而且开销也很小)。是的,你是对的。而斯伦金很难做到正确。(我们已经完成了,但比最初看起来要复杂得多!)