服务器本质上是一个项目队列,而客户端充当这些项目的生产者和/或消费者。Java中的多线程服务器
服务器必须:
- 倾听放/取请求,并相应地处理它们 - 这通常不会花太长时间,它包括:
- 解析短串;
- 安
HashMap.get
; - 获取锁定;
- A
PriorityQueue.poll
或PriorityQueue.offer
;
- 通知所有项目活动的每一个客户端,只要有可能,让每一个客户有一个实时鉴于这是怎么回事的。
设置此功能的最简单的方法,是由具有螺纹accept
荷兰国际集团的客户,然后为每个客户端创建两个线程:
- 一个处理该
InputStream
,哪些块等待请求; - 而另一个处理
OutputStream
,它监听队列上的事件,并将信息发送到客户端。
当然,这是不可扩展的,并且为每个客户端拥有两个线程似乎是浪费。
我也想过使用一个线程,这将
- 设置套接字超时约1
read
秒; - 继续发送每个新事件给客户端,如果
read
超时或处理请求后; - 循环这两个动作。
但是,轮询请求和事件也是浪费。
另一种方法是使用线程池,并将上述两个操作中的每一个放在它们各自的Runnable
中。然后这些可运行的对象将在Executor
中彼此排队。 这似乎也是浪费,如果不是更多。
我一直在读somequestions,我现在好奇NIO,因为非阻塞操作和事件驱动服务器似乎是正确的方法。
以上任何一种设计是否适合这项任务,还是应该使用NIO来解决?
就数字而言,这更是一个锻炼比真正的系统,所以它与数千客户不必交易,但是,理想情况下,它应该能够执行和规模好。
这是有道理的。每个客户端想要线程的主要原因之一是,如果连接速度很慢,那么只有该线程/客户端会因此而受到影响。有一组更新线程将事件广播到所有客户端会遭受连接速度缓慢的影响,但我想这是无法解决的。 – afsantos