当前位置: 首页 > 知识库问答 >
问题:

使用阻塞方法服务多个客户端时的线程池

巢权
2023-03-14

我正在用java开发一个网络服务器,它将为它的客户端提供网络套接字通信。有人建议我在处理许多客户端时使用线程池,因为这比每个客户端使用一个线程要省时得多。

我的问题很简单,Javas ExecutorService、newFixedThreadPool是否能够处理可运行任务队列,并在其中调用线程阻塞方法?

换句话说,我想知道这个线程池是否是异步的?

我问这个问题的原因是,我已经尝试使用一个新的FixedThreadPool,比如说,2个线程。然后当我将3个客户端连接到服务器时,我只能收到前两个客户端的命令。但我想我可能做错了什么,这就是我问的原因。

可运行的任务也处于无限 while 循环中(仅在客户端断开连接时结束)。

共有1个答案

柳豪
2023-03-14

嗯,这取决于您的实现。最简单的情况是让客户端保持线程活动,直到断开连接(或因超时而被踢出)。在这种情况下,线程池不是很有效。我只会重用断开连接的用户线程,而不会创建新的线程(这很好,但并不真正相关)。

第二种情况是仅在需要时激活线程(假设客户端发送或接收消息时)。在这种情况下,您需要记住服务器端(例如保留一个ID),以便能够在不需要线程连接时切断线程连接,并在不需要时重新建立线程连接。为此,必须将套接字保留在某个位置,但未绑定到任何特定线程。

我实际上没有自己编写代码,但我不明白为什么它会工作,因为这是用于网站的机制(即HTTP协议)

 类似资料:
  • 问题内容: 我想在Python中运行一个程序,该程序每秒通过Web套接字向Tornado服务器发送一条消息。我一直在websocket-client上使用该示例; 该示例不起作用,因为它将停止while循环的执行。 有人可以给我一个例子,说明如何正确地将其实现为线程类,我既可以调用它的send方法,又可以接收消息? 问题答案: 在他们的github页面上有一个例子可以做到这一点。好像您是从该示例开

  • 问题内容: 我正在尝试使用我一直在努力的客户端/服务器程序实现多线程。我需要允许多个客户端同时连接到服务器。我目前有4类:客户端,服务器,协议和用于处理线程的工作器。以下代码是我对这些类的拥有的代码: SocketServer类: SocketClient类别: 协议类别: ClientWorker类: 当我运行服务器和客户端时,一切正常。然后,当我尝试运行另一个客户端时,它只是挂在那儿,没有提示

  • 我试图用一个自定义对象创建一个新线程,然后从主线程调用这个自定义对象方法。其思想是,主线程可以继续执行其他任务,而自定义对象可以继续在第二个线程中工作: 输出为: 它应该更像这样: 所以主线程被阻塞,直到方法完成。主线程是否在第二个线程中等待完成(作为返回类型为空,我认为情况不会如此)?还是在第一个线程中执行,因此阻塞了它? 我知道使用下面的代码,我可以在另一个线程中执行,但它每次都会从头开始创建

  • 我正在用Netty玩Spring Webflux(2.0.3.Release),并试图理解服务器和web客户端是如何使用线程的。我用WebClient编写了一些带有http调用链的代码。我怀疑所有调用都是非阻塞的,但我不明白为什么只有一个请求经过整个链路。下面是代码和日志输出: 我对localhost:8080/1进行了4次调用,并得到以下输出。只有一个请求到达了第三个方法。我希望当一个线程被阻塞

  • 问题内容: 我使用nio频道构建了一个简单的聊天应用程序。我对网络和线程非常陌生。该应用程序用于与服务器通信(服务器/客户端聊天应用程序)。 我的问题是服务器不支持多个客户端。我该如何解决这个问题?我的代码中的错误是什么? 问题答案: 初学者Hello NIO Server的 理想之地

  • 问题内容: 服务器和客户端使用我自己的协议(类似于XMPP)进行通信。我应该实现聊天应用程序。因此,当一个用户写String时,应该立即将其通过服务器发送给其他客户端。我在服务器上有sendToAll方法。但是用户只有在按Enter时才能看到其他用户的消息。 用户如何在不按Enter键的情况下接收消息? 这是我的客户: 和带有ServerThread的服务器。 ServerThread。 问题答案