java多线程服务器_Java中的多线程服务器

服务器本质上是项目队列,而客户端充当这些项目的生产者和/或消费者.

服务器必须:

>听取put / take请求并相应地处理它们 – 这通常不会花费太长时间,它包括:

>解析一个短串;

>一个HashMap.get;

>获得锁;

> PriorityQueue.poll或PriorityQueue.offer;

>尽快通知所有项目活动的每个客户,以便每个客户都能实时查看正在发生的事情.

最简单的设置方法是让线程接受客户端,然后为每个客户端创建两个线程:

>一个处理InputStream,阻止等待请求;

>另一个用于处理OutputStream,它侦听队列中的事件,并将信息发送到客户端.

当然这不可扩展,每个客户端有两个线程似乎很浪费.

我还考虑过使用单个线程

>设置套接字超时,读取大约1秒;

>如果读取超时或处理完请求后,继续将每个新事件发送给客户端;

>循环这两个动作.

但是,轮询请求和事件也是浪费.

另一种方法是使用线程池,并将上述两个操作中的每一个放在它们各自的Runnable中.然后,这些runnable将在Executor中相互排队.

这似乎同样浪费,如果不是更多.

我一直在阅读some questions,我现在对NIO感到好奇,因为非阻塞操作和事件驱动的服务器似乎是正确的方法.

以上任何设计是否适合此任务,还是应该使用NIO解决?

就数字而言,这不仅仅是一个练习而是一个真实的系统,因此它不需要处理成千上万的客户,但理想情况下,它应该能够很好地执行和扩展.

解决方法:

每个客户端两个线程绝对不可扩展.

如果服务器上有M个核心,那么实际上你不能比运行M个线程更好.任何更高的东西都会让你震惊,并且会减少每秒执行的操作次数.

更好的设计将可用内核划分为U更新器和L侦听器,其中

U L == M.

为更新程序线程分配每个客户端(理想情况下具有负载平衡,但这是一个装饰).每个更新事件都会多播到所有更新程序线程,每个更新程序线程都会更新其所有已分配的客户端更新程序列表末尾的客户端比一开始时更新的客户端更新,但没有任何帮助:您只有这么多硬件.

类似地,每个客户端都分配给一个侦听器线程,该线程处理多个侦听器.客户端输入被转储到FIFO队列中,并在侦听器线程到达时由侦听器线程处理.

然后,每个线程都可以在内存中保持活动状态,同时客户端数据通过系统移动.设计优雅地降级,因为太多客户端意味着所有更新都会变慢,因为客户端数量的线性函数.你提出的设计会比这更快地降级.

现代(例如,比2002年更晚)的Web服务器将这一切埋在实现的深处,因此开发人员不需要管理它.但它仍然是一项有用的练习.

标签:java,multithreading,concurrency,client-server,nio

来源: https://codeday.me/bug/20190831/1775968.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值