我正在编写一个简单的Java NIO服务器并且有点头疼:我得到正常InputStream
我需要管道到我的客户端。我有一个线程执行所有写操作,因此这会产生一个问题:如果InputStream
阻止,所有其他连接写入将被暂停。
我可以使用InputStream.available()
来检查是否有任何传入数据我可以无阻塞地读取,但是如果我已经到达流末尾,那么我必须调用{{ 1}}要知道。
这给我带来了很大的麻烦,但我不可能相信我是第一个遇到这个问题的人。
到目前为止,我提出的唯一选择是:
read()
创建一个单独的线程,但这只是愚蠢的,因为我首先使用的是非阻塞I / O.我也可以让一个线程池执行此操作,但是再次限制了我可以将InputStream
传送到的同时客户端的数量。当然,如果有一个魔法InputStream
或InputStream
那么这根本不会有任何问题:'(
答案 0 :(得分:3)
“ .....为每个InputStream都有一个单独的线程,但这只是愚蠢的,因为我首先使用非阻塞I / O .... ”
这根本不是愚蠢的。首先,您需要检查是否可以从InputStream实现中检索SelectableChannel。如果确实如此,你很幸运,你可以用选择器注册它并像往常一样。但是很有可能你的InputStream可能有一个不是SelectableChannel的通道,在这种情况下“为每个InputStream创建一个单独的线程”是显而易见的事情,也许是正确的事情。
请注意,在SO中讨论了not able to get a SelectableChannel from an inputstream类似的问题。不幸的是你被困住了。
答案 1 :(得分:-1)
我有一个单一的线程执行所有 写入
您是否已经停下来考虑这是否是问题的一部分而不是解决方案的一部分?