【发布时间】:2011-07-31 12:35:24
【问题描述】:
我有一个需要读取数百个套接字通信的应用程序。
我正在使用具有线程数上限的 ThreadPool 来服务这些套接字。如果套接字没有传入消息,这会导致所有线程阻塞。
我目前使用 100 毫秒的 soTimeout 来避免永久阻塞。我不喜欢这种方法,因为它可能会在它开始接收输入时超时。
还有其他方法可以解决这个问题吗?
我尝试使用 ObjectInputStream.isAvailable() 进行检查,但无论流中是否有数据,它总是返回 0。
我找不到任何其他方法来检查流中是否有数据。这将是理想的,因为那时我可以检查是否有数据,如果没有,则继续下一个流。
【问题讨论】:
-
每个连接没有一个线程有什么原因吗?它确实可以解决一些开销,但对于数百个线程都可以正常工作。
-
确实如此,但实际上确实如此,我对 Sanjay 的回答的第四和第五条评论说明了为什么我不希望每个连接一个线程。
-
我只是想偷看一下 ObjectInputStream,如果有什么东西,把它推回去读,否则没读。也许使用PushBackStreams之类的东西你们怎么看?
-
如果你有 10K 线程,你可以让大约一个完整的核心忙于交换线程。您不能将 PushBackStreams 与 ObjectInputStream 一起使用,因为流是有状态的。
标签: java sockets objectinputstream