【发布时间】:2012-10-19 08:47:29
【问题描述】:
在一个 Java TCP/IP 套接字上处理多个请求是不是很容易。只需接受一条消息并生成一个线程。接受另一条消息并产生另一个线程。问题是一旦你开始产生线程,事情就会变得更加不确定。假设您有 10 个客户端,其中一个客户端不断发出请求,而另外 9 个 9 个以 10% 的过度活跃客户端发送请求,发现更难查看。
您可以解决此问题的一种方法是在您的服务器中拥有一个信号量的哈希映射,其中每个客户端都有一个相应的信号量。在处理任何客户端的请求之前,您可以让它通过其信号量并配置信号量,以便每个客户端在任何时候只能有一定数量的请求。
在这个阶段,我认为是的,但有没有更好的方法或库可以做到这一点?
【问题讨论】:
-
你的意思是像公平的消息队列?但我认为线程在每次请求后自动进入睡眠就足够了,因此其他线程有公平的机会被唤醒并避免饥饿。
-
完全像消息队列。但通常消息在进入队列之前会通过 TCP/IP 套接字。如果此套接字是多线程的,那么您可以做到“公平”。我认为。
-
“其他 9 九个不怎么开火的人不要进去看看”。那没有意义。多线程 TCP 服务器没有理由偏爱一个客户端而不是另一个客户端。无论如何,整个事情都是网络绑定的。所有线程最初都被阻塞等待传入请求。如果一个客户端发送的请求是另一个客户端的 10 倍,它将获得 10 倍的服务,但没有理由他会获得超过 10 次。
-
thread-per-connection 是婴儿的第一个网络模型。你应该看看非阻塞io。
-
我认为您根本没有说得更清楚。我认为您只是构想了一个虚构的问题,并试图找到解决方案。有像 Tomcat 这样的 Java 服务器被数以百万计地部署并处理数十万个客户端,每个客户端对这个所谓的“问题”没有做任何事情。它不存在。触发 90% 请求的客户端应该获得 90% 的服务。你有任何证据证明它没有吗?
标签: java multithreading sockets tcp-ip